Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>

typedef uvlong u64int;

#define TWID64  ((u64int)~(u64int)0)


u64int
unittoull(char *s)
{
        char *es;
        u64int n;

        if(s == nil)
                return TWID64;
        n = strtoul(s, &es, 0);
        if(*es == 'k' || *es == 'K'){
                n *= 1024;
                es++;
        }else if(*es == 'm' || *es == 'M'){
                n *= 1024*1024;
                es++;
        }else if(*es == 'g' || *es == 'G'){
                n *= 1024*1024*1024;
                es++;
        }
        if(*es != '\0')
                return TWID64;
        return n;
}

void
main(int argc, char *argv[])
{
        int fd, i;
        int n = 1000, m;
        int s = 1;
        double *t, t0, t1;
        uchar *buf;     
        double a, d, max, min;

        m = OREAD;
        ARGBEGIN{
        case 'n':
                n = atoi(ARGF());
                break;
        case 's':
                s = unittoull(ARGF());
                if(s < 1 || s > 1024*1024)
                        sysfatal("bad size");
                break;
        case 'r':
                m = OREAD;
                break;
        case 'w':
                m = OWRITE;
                break;
        }ARGEND

        fd = 0;
        if(argc == 1){
                fd = open(argv[0], m);
                if(fd < 0)
                        sysfatal("could not open file: %s: %r", argv[0]);
        }

        buf = malloc(s);
        t = malloc(n*sizeof(double));
        
        t0 = nsec();
        for(i=0; i<n; i++){
                if(m == OREAD){
                        if(pread(fd, buf, s, 0) < s)
                                sysfatal("bad read: %r");
                }else{
                        if(pwrite(fd, buf, s, 0) < s)
                                sysfatal("bad write: %r");
                }
                t1 = nsec();
                t[i] = (t1 - t0)*1e-3;
                t0 = t1;
        }

        a = 0.;
        d = 0.;
        max = 0.;
        min = 1e12;

        for(i=0; i<n; i++){
                a += t[i];
                if(max < t[i])
                        max = t[i];
                if(min > t[i])
                        min = t[i];
        }

        a /= n;
        
        for(i=0; i<n; i++)
                d += (a - t[i]) * (a - t[i]);
        d /= n;
        d = sqrt(d);

        print("avg = %.0fµs min = %.0fµs max = %.0fµs dev = %.0fµs\n", a, min, max, d);

        exits(0);
}