git.iko.soy/distributed-process
on master help sign in
Compute average and stddev of the round-trip latency
commitcb07733436ec5fff7353a28dff1a411e2ecf66eb authorEdsko de Vries <edsko@well-typed.com> dateTue 10 Apr 2012, 17:10 (15 years ago) parentee77eeb
1 file changed+44−15
benchmarks/pingtest.c+44−15
benchmarks/pingtest.c+44−15
@@ -7,8 +7,18 @@
77#include <unistd.h>
88#include <signal.h>
99#include <errno.h>
10+#include <time.h>
11+#include <sys/time.h>
12+#include <math.h>
13+
14+// Note: this is not consistent across CPUs (and hence across threads on multicore machines)
15+double timestamp() {
16+ struct timeval tp;
17+ gettimeofday(&tp, NULL);
18+ return ((double) tp.tv_sec) * 1e6 + (double) tp.tv_usec;
19+}
1020
11−int server(int pings) {
21+int server() {
1222 struct addrinfo hints, *res;
1323 int error, server_socket;
1424
@@ -47,7 +57,7 @@ int server(int pings) {
4757 socklen_t addr_size;
4858 client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &addr_size);
4959
50− for(int i = 0; i < pings; i++) {
60+ for(;;) {
5161 char buf[8];
5262 ssize_t read = recv(client_socket, &buf, 8, 0);
5363 // printf("server received '%s'\n", buf);
@@ -85,36 +95,55 @@ int client(int pings) {
8595 return -1;
8696 }
8797
98+ double* round_trip_latency = (double*) calloc(pings, sizeof(double));
99+
88100 for(int i = 0; i < pings; i++) {
101+ double timestamp_before = timestamp();
102+
89103 send(client_socket, "ping123", 8, 0);
90−
104+
91105 char buf[8];
92106 ssize_t read = recv(client_socket, &buf, 8, 0);
93107 // printf("client received '%s'\n", buf);
108+
109+ double timestamp_after = timestamp();
110+ round_trip_latency[i] = timestamp_after - timestamp_before;
94111 }
95112
96− printf("pinged %d times\n", pings);
113+ printf("client did %d pings\n", pings);
114+
115+ // compute average
116+ double round_trip_latency_average = 0;
117+ for(int i = 0; i < pings; i++) {
118+ round_trip_latency_average += round_trip_latency[i];
119+ };
120+ round_trip_latency_average /= (double) pings;
121+
122+
123+ // compute standard deviation
124+ double round_trip_latency_stddev = 0;
125+ for(int i = 0; i < pings; i++) {
126+ round_trip_latency_stddev += pow(round_trip_latency[i] - round_trip_latency_average, 2);
127+ }
128+ round_trip_latency_stddev = sqrt(round_trip_latency_stddev / (double) (pings - 1));
129+
130+ printf("average round-trip latency: %lf us (standard devitation %lf us)\n", round_trip_latency_average, round_trip_latency_stddev);
97131
98132 freeaddrinfo(res);
99133 return 0;
100134}
101135
102136int usage(int argc, char** argv) {
103− printf("usage: %s (server | client) <number of pings>\n", argv[0]);
137+ printf("usage: %s server or %s client <number of pings>\n", argv[0], argv[0]);
104138 return -1;
105139}
106140
107141int main(int argc, char** argv) {
108− if(argc != 3) {
109− return usage(argc, argv);
110− }
111−
112− int pings = 0;
113− sscanf(argv[2], "%d", &pings);
114−
115− if(!strcmp(argv[1], "server")) {
116− return server(pings);
117− } else if(!strcmp(argv[1], "client")) {
142+ if(argc == 2 && !strcmp(argv[1], "server")) {
143+ return server();
144+ } else if(argc == 3 && !strcmp(argv[1], "client")) {
145+ int pings = 0;
146+ sscanf(argv[2], "%d", &pings);
118147 return client(pings);
119148 } else {
120149 return usage(argc, argv);