Mark Kirkwood wrote:

I used the attached program to read a cached 781MB file sequentially and randomly with a specified block size (see below).

In the interest of making it easy for anyone to re-test this later, I'll in-line the program source here (I did post a link to my web space, but that could get cleaned up by accident...)

-------------------------------------------------------------------------------------------

/*
 * readtest.c: read a file sequentially or randomly
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/uio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <math.h>


void
usage(char *prog)
{
printf("usage %s filename blocksize 1|0 (0 - random, 1 - sequential)\n",
            prog);

    return;
}


int
main(int argc, char **argv) {

    int     fd;
    char    *file;
    struct  stat    *fileinfo;
    char    *buf;
    int     blocksz;
    int     numblocks, i;
    off_t   offset, offsetmin, offsetmax;
    double  offsetsum, offsetsumx2;
    int     seq;
    int     stats = 0;
    struct  timeval starttp, endtp, elapsedtp;
    double  elapsed;
    double  iorate;


    if (argc != 4 && argc != 5) {
        usage(argv[0]);
        exit(1);
    } else {
        if ((file = (char *) malloc(strlen(argv[1]))) == NULL) {
            printf("out of memory!\n");
            exit(2);
        }

        strcpy(file, argv[1]);
        blocksz = atoi(argv[2]);
        seq = atoi(argv[3]);
        if (argc == 5)
            stats = 1;
    }


    /* Start timing. */
    gettimeofday(&starttp, NULL);

    if ((fd = open(file, O_RDONLY)) == -1) {
        /* Can't open the file. */
        perror("cannot open");
        exit(1);
    } else {
        /* How many random sequential access calls are needed? */
        fileinfo = (struct stat*) malloc(sizeof(struct stat));
        fstat(fd,fileinfo);
        numblocks = (fileinfo->st_size)/blocksz;
        free(fileinfo);
    }


    /* Allocate buffer. */
    buf = (char *) malloc(blocksz);
    if (buf == NULL) {
        printf("out of memory!\n");
        exit(2);
    }


    /* If we are random, initialize. */
    if (seq != 1)
        srandom(2006122111);


    /*
     * Read the file sequentially or randomly.
     * If random then calculate the offset to seek to using the formula:
     *
     *   offet in blocks = random() % (numblocks - 1)
     *
     */
    for (i = 0; i < numblocks; i++) {
        if (seq == 1) {
            offset = (off_t)i * blocksz;        /* only used for stats */
            if (read(fd, buf, blocksz) != blocksz) {
                perror("read failed");
                exit(1);
            }
        } else {
            offset = (off_t) (random() % (numblocks - 1)) * blocksz;
            if (lseek(fd, offset, SEEK_SET) == -1) {
                perror("seek failed");
                exit(1);
            }
            if (read(fd, buf, blocksz) != blocksz) {
                perror("read failed");
                exit(1);
            }
        }

        /* If we are collecting stats...*/
        if (stats){
            if (i == 0) {
                offsetmin = offsetmax = offset;
                offsetsum = (double)offset;
                offsetsumx2 = (double)offset*(double)offset;
            } else {
                if (offset < offsetmin)
                    offsetmin = offset;

                if(offset > offsetmax)
                    offsetmax = offset;

                offsetsum += (double)offset;
                offsetsumx2 += (double)offset*(double)offset;
            }
        }
    }

    free(buf);


    /* Close file now we are finished. */
    close(fd);

    gettimeofday(&endtp, NULL);
    timersub(&endtp, &starttp, &elapsedtp);
elapsed = (double)elapsedtp.tv_sec + (double)elapsedtp.tv_usec/1000000.0;

    iorate = (double)((double)numblocks*(double)blocksz)/(double)elapsed;

printf("%s reads: %d of: %d bytes elapsed: %.4fs io rate: %.0f bytes/s\n",
            (seq == 1) ? "sequential" : "random",
            numblocks, blocksz,elapsed, iorate);

    if (stats) {
        printf("max offset: %d min offset: %d\n", offsetmax, offsetmin);
        printf("avg offset: %.0f ", offsetsum / (double)numblocks);
        printf("stddev offset: %.0f\n",
                sqrt(offsetsumx2 / (double)numblocks -
                     (offsetsum / (double)numblocks) *
                     (offsetsum / (double)numblocks)));
    }

    free(file);
    exit(0);

}
_______________________________________________
freebsd-performance@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-performance
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to