1*5e96a66cSDavid du Colombier #include <u.h>
2*5e96a66cSDavid du Colombier #include <libc.h>
3*5e96a66cSDavid du Colombier
4*5e96a66cSDavid du Colombier typedef uvlong u64int;
5*5e96a66cSDavid du Colombier
6*5e96a66cSDavid du Colombier #define TWID64 ((u64int)~(u64int)0)
7*5e96a66cSDavid du Colombier
8*5e96a66cSDavid du Colombier
9*5e96a66cSDavid du Colombier u64int
unittoull(char * s)10*5e96a66cSDavid du Colombier unittoull(char *s)
11*5e96a66cSDavid du Colombier {
12*5e96a66cSDavid du Colombier char *es;
13*5e96a66cSDavid du Colombier u64int n;
14*5e96a66cSDavid du Colombier
15*5e96a66cSDavid du Colombier if(s == nil)
16*5e96a66cSDavid du Colombier return TWID64;
17*5e96a66cSDavid du Colombier n = strtoul(s, &es, 0);
18*5e96a66cSDavid du Colombier if(*es == 'k' || *es == 'K'){
19*5e96a66cSDavid du Colombier n *= 1024;
20*5e96a66cSDavid du Colombier es++;
21*5e96a66cSDavid du Colombier }else if(*es == 'm' || *es == 'M'){
22*5e96a66cSDavid du Colombier n *= 1024*1024;
23*5e96a66cSDavid du Colombier es++;
24*5e96a66cSDavid du Colombier }else if(*es == 'g' || *es == 'G'){
25*5e96a66cSDavid du Colombier n *= 1024*1024*1024;
26*5e96a66cSDavid du Colombier es++;
27*5e96a66cSDavid du Colombier }
28*5e96a66cSDavid du Colombier if(*es != '\0')
29*5e96a66cSDavid du Colombier return TWID64;
30*5e96a66cSDavid du Colombier return n;
31*5e96a66cSDavid du Colombier }
32*5e96a66cSDavid du Colombier
33*5e96a66cSDavid du Colombier void
main(int argc,char * argv[])34*5e96a66cSDavid du Colombier main(int argc, char *argv[])
35*5e96a66cSDavid du Colombier {
36*5e96a66cSDavid du Colombier int fd, i;
37*5e96a66cSDavid du Colombier int n = 1000, m;
38*5e96a66cSDavid du Colombier int s = 1;
39*5e96a66cSDavid du Colombier double *t, t0, t1;
40*5e96a66cSDavid du Colombier uchar *buf;
41*5e96a66cSDavid du Colombier double a, d, max, min;
42*5e96a66cSDavid du Colombier
43*5e96a66cSDavid du Colombier m = OREAD;
44*5e96a66cSDavid du Colombier ARGBEGIN{
45*5e96a66cSDavid du Colombier case 'n':
46*5e96a66cSDavid du Colombier n = atoi(ARGF());
47*5e96a66cSDavid du Colombier break;
48*5e96a66cSDavid du Colombier case 's':
49*5e96a66cSDavid du Colombier s = unittoull(ARGF());
50*5e96a66cSDavid du Colombier if(s < 1 || s > 1024*1024)
51*5e96a66cSDavid du Colombier sysfatal("bad size");
52*5e96a66cSDavid du Colombier break;
53*5e96a66cSDavid du Colombier case 'r':
54*5e96a66cSDavid du Colombier m = OREAD;
55*5e96a66cSDavid du Colombier break;
56*5e96a66cSDavid du Colombier case 'w':
57*5e96a66cSDavid du Colombier m = OWRITE;
58*5e96a66cSDavid du Colombier break;
59*5e96a66cSDavid du Colombier }ARGEND
60*5e96a66cSDavid du Colombier
61*5e96a66cSDavid du Colombier fd = 0;
62*5e96a66cSDavid du Colombier if(argc == 1){
63*5e96a66cSDavid du Colombier fd = open(argv[0], m);
64*5e96a66cSDavid du Colombier if(fd < 0)
65*5e96a66cSDavid du Colombier sysfatal("could not open file: %s: %r", argv[0]);
66*5e96a66cSDavid du Colombier }
67*5e96a66cSDavid du Colombier
68*5e96a66cSDavid du Colombier buf = malloc(s);
69*5e96a66cSDavid du Colombier t = malloc(n*sizeof(double));
70*5e96a66cSDavid du Colombier
71*5e96a66cSDavid du Colombier t0 = nsec();
72*5e96a66cSDavid du Colombier for(i=0; i<n; i++){
73*5e96a66cSDavid du Colombier if(m == OREAD){
74*5e96a66cSDavid du Colombier if(pread(fd, buf, s, 0) < s)
75*5e96a66cSDavid du Colombier sysfatal("bad read: %r");
76*5e96a66cSDavid du Colombier }else{
77*5e96a66cSDavid du Colombier if(pwrite(fd, buf, s, 0) < s)
78*5e96a66cSDavid du Colombier sysfatal("bad write: %r");
79*5e96a66cSDavid du Colombier }
80*5e96a66cSDavid du Colombier t1 = nsec();
81*5e96a66cSDavid du Colombier t[i] = (t1 - t0)*1e-3;
82*5e96a66cSDavid du Colombier t0 = t1;
83*5e96a66cSDavid du Colombier }
84*5e96a66cSDavid du Colombier
85*5e96a66cSDavid du Colombier a = 0.;
86*5e96a66cSDavid du Colombier d = 0.;
87*5e96a66cSDavid du Colombier max = 0.;
88*5e96a66cSDavid du Colombier min = 1e12;
89*5e96a66cSDavid du Colombier
90*5e96a66cSDavid du Colombier for(i=0; i<n; i++){
91*5e96a66cSDavid du Colombier a += t[i];
92*5e96a66cSDavid du Colombier if(max < t[i])
93*5e96a66cSDavid du Colombier max = t[i];
94*5e96a66cSDavid du Colombier if(min > t[i])
95*5e96a66cSDavid du Colombier min = t[i];
96*5e96a66cSDavid du Colombier }
97*5e96a66cSDavid du Colombier
98*5e96a66cSDavid du Colombier a /= n;
99*5e96a66cSDavid du Colombier
100*5e96a66cSDavid du Colombier for(i=0; i<n; i++)
101*5e96a66cSDavid du Colombier d += (a - t[i]) * (a - t[i]);
102*5e96a66cSDavid du Colombier d /= n;
103*5e96a66cSDavid du Colombier d = sqrt(d);
104*5e96a66cSDavid du Colombier
105*5e96a66cSDavid du Colombier print("avg = %.0fµs min = %.0fµs max = %.0fµs dev = %.0fµs\n", a, min, max, d);
106*5e96a66cSDavid du Colombier
107*5e96a66cSDavid du Colombier exits(0);
108*5e96a66cSDavid du Colombier }
109*5e96a66cSDavid du Colombier
110