From 1170563c164ea0200e06485fd4fe9fdfad1b646f Mon Sep 17 00:00:00 2001 From: desbma Date: Mon, 22 Feb 2016 21:10:01 +0100 Subject: [PATCH] Use clock_gettime with CLOCK_MONOTONIC if available --- pipe_lat.c | 48 +++++++++++++++++++++++++++++++++++++++++------- pipe_thr.c | 46 ++++++++++++++++++++++++++++++++++++++++------ tcp_lat.c | 46 ++++++++++++++++++++++++++++++++++++++++------ tcp_thr.c | 53 ++++++++++++++++++++++++++++++++++++++++++++--------- unix_lat.c | 46 ++++++++++++++++++++++++++++++++++++++++------ unix_thr.c | 52 +++++++++++++++++++++++++++++++++++++++++++--------- 6 files changed, 248 insertions(+), 43 deletions(-) diff --git a/pipe_lat.c b/pipe_lat.c index d0fcd64..06ac14d 100644 --- a/pipe_lat.c +++ b/pipe_lat.c @@ -32,6 +32,11 @@ #include #include #include +#include + +#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) && defined(_POSIX_MONOTONIC_CLOCK) +#define HAS_CLOCK_GETTIME_MONOTONIC +#endif int main(int argc, char *argv[]) @@ -42,7 +47,11 @@ int main(int argc, char *argv[]) int size; char *buf; int64_t count, i, delta; +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + struct timespec start, stop; +#else struct timeval start, stop; +#endif if (argc != 3) { printf ("usage: pipe_lat \n"); @@ -85,8 +94,18 @@ int main(int argc, char *argv[]) } } } else { /* parent */ - - gettimeofday(&start, NULL); + +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + if (clock_gettime(CLOCK_MONOTONIC, &start) == -1) { + perror("clock_gettime"); + return 1; + } +#else + if (gettimeofday(&start, NULL) == -1) { + perror("gettimeofday"); + return 1; + } +#endif for (i = 0; i < count; i++) { @@ -99,14 +118,29 @@ int main(int argc, char *argv[]) perror("read"); return 1; } - + } - gettimeofday(&stop, NULL); +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + if (clock_gettime(CLOCK_MONOTONIC, &stop) == -1) { + perror("clock_gettime"); + return 1; + } + + delta = ((stop.tv_sec - start.tv_sec) * 1000000 + + (stop.tv_nsec - start.tv_nsec) / 1000); + +#else + if (gettimeofday(&stop, NULL) == -1) { + perror("gettimeofday"); + return 1; + } + + delta = (stop.tv_sec - start.tv_sec) * 1000000 + + (stop.tv_usec - start.tv_usec); + +#endif - delta = ((stop.tv_sec - start.tv_sec) * (int64_t) 1000000 + - stop.tv_usec - start.tv_usec); - printf("average latency: %lli us\n", delta / (count * 2)); } diff --git a/pipe_thr.c b/pipe_thr.c index ea0ab26..158be89 100644 --- a/pipe_thr.c +++ b/pipe_thr.c @@ -32,6 +32,11 @@ #include #include #include +#include + +#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) && defined(_POSIX_MONOTONIC_CLOCK) +#define HAS_CLOCK_GETTIME_MONOTONIC +#endif int main(int argc, char *argv[]) @@ -41,7 +46,11 @@ int main(int argc, char *argv[]) int size; char *buf; int64_t count, i, delta; +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + struct timespec start, stop; +#else struct timeval start, stop; +#endif if (argc != 3) { printf ("usage: pipe_thr \n"); @@ -77,7 +86,17 @@ int main(int argc, char *argv[]) } else { /* parent */ - gettimeofday(&start, NULL); +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + if (clock_gettime(CLOCK_MONOTONIC, &start) == -1) { + perror("clock_gettime"); + return 1; + } +#else + if (gettimeofday(&start, NULL) == -1) { + perror("gettimeofday"); + return 1; + } +#endif for (i = 0; i < count; i++) { if (write(fds[1], buf, size) != size) { @@ -86,13 +105,28 @@ int main(int argc, char *argv[]) } } - gettimeofday(&stop, NULL); +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + if (clock_gettime(CLOCK_MONOTONIC, &stop) == -1) { + perror("clock_gettime"); + return 1; + } + + delta = ((stop.tv_sec - start.tv_sec) * 1000000 + + (stop.tv_nsec - start.tv_nsec) / 1000); + +#else + if (gettimeofday(&stop, NULL) == -1) { + perror("gettimeofday"); + return 1; + } + + delta = (stop.tv_sec - start.tv_sec) * 1000000 + + (stop.tv_usec - start.tv_usec); - delta = ((stop.tv_sec - start.tv_sec) * (int64_t) 1e6 + - stop.tv_usec - start.tv_usec); +#endif - printf("average throughput: %lli msg/s\n", (count * (int64_t) 1e6) / delta); - printf("average throughput: %lli Mb/s\n", (((count * (int64_t) 1e6) / delta) * size * 8) / (int64_t) 1e6); + printf("average throughput: %lli msg/s\n", (count * 1000000) / delta); + printf("average throughput: %lli Mb/s\n", (((count * 1000000) / delta) * size * 8) / 1000000); } return 0; diff --git a/tcp_lat.c b/tcp_lat.c index 0858c7f..0d7ab91 100644 --- a/tcp_lat.c +++ b/tcp_lat.c @@ -34,6 +34,11 @@ #include #include #include +#include + +#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) && defined(_POSIX_MONOTONIC_CLOCK) +#define HAS_CLOCK_GETTIME_MONOTONIC +#endif int main(int argc, char *argv[]) @@ -41,7 +46,11 @@ int main(int argc, char *argv[]) int size; char *buf; int64_t count, i, delta; +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + struct timespec start, stop; +#else struct timeval start, stop; +#endif ssize_t len; size_t sofar; @@ -139,7 +148,17 @@ int main(int argc, char *argv[]) return 1; } - gettimeofday(&start, NULL); +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + if (clock_gettime(CLOCK_MONOTONIC, &start) == -1) { + perror("clock_gettime"); + return 1; + } +#else + if (gettimeofday(&start, NULL) == -1) { + perror("gettimeofday"); + return 1; + } +#endif for (i = 0; i < count; i++) { @@ -156,14 +175,29 @@ int main(int argc, char *argv[]) } sofar += len; } - + + } + +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + if (clock_gettime(CLOCK_MONOTONIC, &stop) == -1) { + perror("clock_gettime"); + return 1; } - gettimeofday(&stop, NULL); + delta = ((stop.tv_sec - start.tv_sec) * 1000000 + + (stop.tv_nsec - start.tv_nsec) / 1000); + +#else + if (gettimeofday(&stop, NULL) == -1) { + perror("gettimeofday"); + return 1; + } + + delta = (stop.tv_sec - start.tv_sec) * 1000000 + + (stop.tv_usec - start.tv_usec); + +#endif - delta = ((stop.tv_sec - start.tv_sec) * (int64_t) 1e6 + - stop.tv_usec - start.tv_usec); - printf("average latency: %lli us\n", delta / (count * 2)); } diff --git a/tcp_thr.c b/tcp_thr.c index 8ef1fe0..8506f53 100644 --- a/tcp_thr.c +++ b/tcp_thr.c @@ -35,6 +35,12 @@ #include #include #include +#include + +#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) && defined(_POSIX_MONOTONIC_CLOCK) +#define HAS_CLOCK_GETTIME_MONOTONIC +#endif + int main(int argc, char *argv[]) @@ -42,7 +48,11 @@ int main(int argc, char *argv[]) int size; char *buf; int64_t count, i, delta; +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + struct timespec start, stop; +#else struct timeval start, stop; +#endif ssize_t len; size_t sofar; @@ -138,8 +148,18 @@ int main(int argc, char *argv[]) perror("setsockopt"); return 1; } - - gettimeofday(&start, NULL); + +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + if (clock_gettime(CLOCK_MONOTONIC, &start) == -1) { + perror("clock_gettime"); + return 1; + } +#else + if (gettimeofday(&start, NULL) == -1) { + perror("gettimeofday"); + return 1; + } +#endif for (i = 0; i < count; i++) { if (write(sockfd, buf, size) != size) { @@ -148,13 +168,28 @@ int main(int argc, char *argv[]) } } - gettimeofday(&stop, NULL); - - delta = ((stop.tv_sec - start.tv_sec) * (int64_t) 1e6 + - stop.tv_usec - start.tv_usec); - - printf("average throughput: %lli msg/s\n", (count * (int64_t) 1e6) / delta); - printf("average throughput: %lli Mb/s\n", (((count * (int64_t) 1e6) / delta) * size * 8) / (int64_t) 1e6); +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + if (clock_gettime(CLOCK_MONOTONIC, &stop) == -1) { + perror("clock_gettime"); + return 1; + } + + delta = ((stop.tv_sec - start.tv_sec) * 1000000 + + (stop.tv_nsec - start.tv_nsec) / 1000); + +#else + if (gettimeofday(&stop, NULL) == -1) { + perror("gettimeofday"); + return 1; + } + + delta = (stop.tv_sec - start.tv_sec) * 1000000 + + (stop.tv_usec - start.tv_usec); + +#endif + + printf("average throughput: %lli msg/s\n", (count * 1000000) / delta); + printf("average throughput: %lli Mb/s\n", (((count * 1000000) / delta) * size * 8) / 1000000); } return 0; diff --git a/unix_lat.c b/unix_lat.c index 7af7a75..6c64474 100644 --- a/unix_lat.c +++ b/unix_lat.c @@ -32,6 +32,11 @@ #include #include #include +#include + +#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) && defined(_POSIX_MONOTONIC_CLOCK) +#define HAS_CLOCK_GETTIME_MONOTONIC +#endif int main(int argc, char *argv[]) @@ -40,7 +45,11 @@ int main(int argc, char *argv[]) int size; char *buf; int64_t count, i, delta; +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + struct timespec start, stop; +#else struct timeval start, stop; +#endif if (argc != 3) { printf ("usage: unix_lat \n"); @@ -79,7 +88,17 @@ int main(int argc, char *argv[]) } } else { /* parent */ - gettimeofday(&start, NULL); +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + if (clock_gettime(CLOCK_MONOTONIC, &start) == -1) { + perror("clock_gettime"); + return 1; + } +#else + if (gettimeofday(&start, NULL) == -1) { + perror("gettimeofday"); + return 1; + } +#endif for (i = 0; i < count; i++) { @@ -92,14 +111,29 @@ int main(int argc, char *argv[]) perror("read"); return 1; } - + + } + +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + if (clock_gettime(CLOCK_MONOTONIC, &stop) == -1) { + perror("clock_gettime"); + return 1; } - gettimeofday(&stop, NULL); + delta = ((stop.tv_sec - start.tv_sec) * 1000000 + + (stop.tv_nsec - start.tv_nsec) / 1000); + +#else + if (gettimeofday(&stop, NULL) == -1) { + perror("gettimeofday"); + return 1; + } + + delta = (stop.tv_sec - start.tv_sec) * 1000000 + + (stop.tv_usec - start.tv_usec); + +#endif - delta = ((stop.tv_sec - start.tv_sec) * (int64_t) 1e6 + - stop.tv_usec - start.tv_usec); - printf("average latency: %lli us\n", delta / (count * 2)); } diff --git a/unix_thr.c b/unix_thr.c index 7b8c74b..85e69fd 100644 --- a/unix_thr.c +++ b/unix_thr.c @@ -32,6 +32,11 @@ #include #include #include +#include + +#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) && defined(_POSIX_MONOTONIC_CLOCK) +#define HAS_CLOCK_GETTIME_MONOTONIC +#endif int main(int argc, char *argv[]) @@ -40,7 +45,11 @@ int main(int argc, char *argv[]) int size; char *buf; int64_t count, i, delta; +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + struct timespec start, stop; +#else struct timeval start, stop; +#endif if (argc != 3) { printf ("usage: unix_thr \n"); @@ -75,8 +84,18 @@ int main(int argc, char *argv[]) } } else { /* parent */ - - gettimeofday(&start, NULL); + +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + if (clock_gettime(CLOCK_MONOTONIC, &start) == -1) { + perror("clock_gettime"); + return 1; + } +#else + if (gettimeofday(&start, NULL) == -1) { + perror("gettimeofday"); + return 1; + } +#endif for (i = 0; i < count; i++) { if (write(fds[0], buf, size) != size) { @@ -85,13 +104,28 @@ int main(int argc, char *argv[]) } } - gettimeofday(&stop, NULL); - - delta = ((stop.tv_sec - start.tv_sec) * (int64_t) 1e6 + - stop.tv_usec - start.tv_usec); - - printf("average throughput: %lli msg/s\n", (count * (int64_t) 1e6) / delta); - printf("average throughput: %lli Mb/s\n", (((count * (int64_t) 1e6) / delta) * size * 8) / (int64_t) 1e6); +#ifdef HAS_CLOCK_GETTIME_MONOTONIC + if (clock_gettime(CLOCK_MONOTONIC, &stop) == -1) { + perror("clock_gettime"); + return 1; + } + + delta = ((stop.tv_sec - start.tv_sec) * 1000000 + + (stop.tv_nsec - start.tv_nsec) / 1000); + +#else + if (gettimeofday(&stop, NULL) == -1) { + perror("gettimeofday"); + return 1; + } + + delta = (stop.tv_sec - start.tv_sec) * 1000000 + + (stop.tv_usec - start.tv_usec); + +#endif + + printf("average throughput: %lli msg/s\n", (count * 1000000) / delta); + printf("average throughput: %lli Mb/s\n", (((count * 1000000) / delta) * size * 8) / 1000000); } return 0;