Blob
1 #include <u.h>2 #include <libc.h>4 typedef uvlong u64int;6 #define TWID64 ((u64int)~(u64int)0)9 u64int10 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 void34 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 }ARGEND61 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);108 }