9ping.c (1559B)
1 #include <u.h> 2 #include <libc.h> 3 4 typedef uvlong u64int; 5 6 #define TWID64 ((u64int)~(u64int)0) 7 8 9 u64int 10 unittoull(char *s) 11 { 12 char *es; 13 u64int n; 14 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 } 32 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; 42 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 60 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 } 67 68 buf = malloc(s); 69 t = malloc(n*sizeof(double)); 70 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 } 84 85 a = 0.; 86 d = 0.; 87 max = 0.; 88 min = 1e12; 89 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 } 97 98 a /= n; 99 100 for(i=0; i<n; i++) 101 d += (a - t[i]) * (a - t[i]); 102 d /= n; 103 d = sqrt(d); 104 105 print("avg = %.0fµs min = %.0fµs max = %.0fµs dev = %.0fµs\n", a, min, max, d); 106 107 exits(0); 108 }