Blob


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