xref: /plan9/sys/src/cmd/fossil/9ping.c (revision 5e96a66c77eb9140492ca53f857cbbf108e128ed)
1 #include <u.h>
2 #include <libc.h>
3 
4 typedef uvlong u64int;
5 
6 #define TWID64	((u64int)~(u64int)0)
7 
8 
9 u64int
unittoull(char * s)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
main(int argc,char * argv[])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 }
109 
110