git.iko.soy/distributed-process
on master help sign in
Compute average and stddev of the round-trip latency
cb07733Edsko de Vries
benchmarks/pingtest.c+44−15
@@ -7,8 +7,18 @@
7#include <unistd.h>
7#include <unistd.h>
8#include <signal.h>
8#include <signal.h>
9#include <errno.h>
9#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+}
10
20
11−int server(int pings) {
21+int server() {
12 struct addrinfo hints, *res;
22 struct addrinfo hints, *res;
13 int error, server_socket;
23 int error, server_socket;
14
24
@@ -47,7 +57,7 @@ int server(int pings) {
47 socklen_t addr_size;
57 socklen_t addr_size;
48 client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &addr_size);
58 client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &addr_size);
49
59
50− for(int i = 0; i < pings; i++) {
60+ for(;;) {
51 char buf[8];
61 char buf[8];
52 ssize_t read = recv(client_socket, &buf, 8, 0);
62 ssize_t read = recv(client_socket, &buf, 8, 0);
53 // printf("server received '%s'\n", buf);
63 // printf("server received '%s'\n", buf);
@@ -85,36 +95,55 @@ int client(int pings) {
85 return -1;
95 return -1;
86 }
96 }
87
97
98+ double* round_trip_latency = (double*) calloc(pings, sizeof(double));
99+
88 for(int i = 0; i < pings; i++) {
100 for(int i = 0; i < pings; i++) {
101+ double timestamp_before = timestamp();
102+
89 send(client_socket, "ping123", 8, 0);
103 send(client_socket, "ping123", 8, 0);
90−
104+
91 char buf[8];
105 char buf[8];
92 ssize_t read = recv(client_socket, &buf, 8, 0);
106 ssize_t read = recv(client_socket, &buf, 8, 0);
93 // printf("client received '%s'\n", buf);
107 // printf("client received '%s'\n", buf);
108+
109+ double timestamp_after = timestamp();
110+ round_trip_latency[i] = timestamp_after - timestamp_before;
94 }
111 }
95
112
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);
97
131
98 freeaddrinfo(res);
132 freeaddrinfo(res);
99 return 0;
133 return 0;
100}
134}
101
135
102int usage(int argc, char** argv) {
136int 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]);
104 return -1;
138 return -1;
105}
139}
106
140
107int main(int argc, char** argv) {
141int main(int argc, char** argv) {
108− if(argc != 3) {
142+ if(argc == 2 && !strcmp(argv[1], "server")) {
109− return usage(argc, argv);
143+ return server();
110− }
144+ } else if(argc == 3 && !strcmp(argv[1], "client")) {
111−
112− int pings = 0;
145+ int pings = 0;
113− sscanf(argv[2], "%d", &pings);
146+ sscanf(argv[2], "%d", &pings);
114−
115− if(!strcmp(argv[1], "server")) {
116− return server(pings);
117− } else if(!strcmp(argv[1], "client")) {
118 return client(pings);
147 return client(pings);
119 } else {
148 } else {
120 return usage(argc, argv);
149 return usage(argc, argv);