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