|  | #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); | 
|  | } |