From bc409e7511f66ed1d20b5d820b1e11dea4167873 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 12 Apr 2012 00:32:44 +0200 Subject: [PATCH] PEP 418: Add bench_time.c --- pep-0418/bench_time.c | 162 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 pep-0418/bench_time.c diff --git a/pep-0418/bench_time.c b/pep-0418/bench_time.c new file mode 100644 index 000000000..3d2af8c05 --- /dev/null +++ b/pep-0418/bench_time.c @@ -0,0 +1,162 @@ +/* + * Benchmark program written for the PEP 418. + * + * gcc bench_time.c -O3 -lrt -o bench_time && ./bench_time + */ + +#include +#include +#include + +#define NRUN 5 +#define NLOOP 1000000 +#define UNROLL(expr) \ + expr; expr; expr; expr; expr; expr; expr; expr; expr; expr +#define NUNROLL 10 + +typedef struct { + const char *name; + clockid_t identifier; +} CLOCK; + +CLOCK clocks[] = { +#ifdef CLOCK_REALTIME_COARSE + {"CLOCK_REALTIME_COARSE", CLOCK_REALTIME_COARSE}, +#endif +#ifdef CLOCK_MONOTONIC_COARSE + {"CLOCK_MONOTONIC_COARSE", CLOCK_MONOTONIC_COARSE}, +#endif +#ifdef CLOCK_THREAD_CPUTIME_ID + {"CLOCK_THREAD_CPUTIME_ID", CLOCK_THREAD_CPUTIME_ID}, +#endif +#ifdef CLOCK_PROCESS_CPUTIME_ID + {"CLOCK_PROCESS_CPUTIME_ID", CLOCK_PROCESS_CPUTIME_ID}, +#endif +#ifdef CLOCK_MONOTONIC_RAW + {"CLOCK_MONOTONIC_RAW", CLOCK_MONOTONIC_RAW}, +#endif +#ifdef CLOCK_VIRTUAL + {"CLOCK_VIRTUAL", CLOCK_VIRTUAL}, +#endif +#ifdef CLOCK_UPTIME_FAST + {"CLOCK_UPTIME_FAST", CLOCK_UPTIME_FAST}, +#endif +#ifdef CLOCK_UPTIME_PRECISE + {"CLOCK_UPTIME_PRECISE", CLOCK_UPTIME_PRECISE}, +#endif +#ifdef CLOCK_UPTIME + {"CLOCK_UPTIME", CLOCK_UPTIME}, +#endif +#ifdef CLOCK_MONOTONIC_FAST + {"CLOCK_MONOTONIC_FAST", CLOCK_MONOTONIC_FAST}, +#endif +#ifdef CLOCK_MONOTONIC_PRECISE + {"CLOCK_MONOTONIC_PRECISE", CLOCK_MONOTONIC_PRECISE}, +#endif +#ifdef CLOCK_REALTIME_FAST + {"CLOCK_REALTIME_FAST", CLOCK_REALTIME_FAST}, +#endif +#ifdef CLOCK_REALTIME_PRECISE + {"CLOCK_REALTIME_PRECISE", CLOCK_REALTIME_PRECISE}, +#endif +#ifdef CLOCK_SECOND + {"CLOCK_SECOND", CLOCK_SECOND}, +#endif +#ifdef CLOCK_PROF + {"CLOCK_PROF", CLOCK_PROF}, +#endif + {"CLOCK_MONOTONIC", CLOCK_MONOTONIC}, + {"CLOCK_REALTIME", CLOCK_REALTIME} +}; +#define NCLOCKS (sizeof(clocks) / sizeof(clocks[0])) + +void bench_clock_gettime(clockid_t clkid) +{ + unsigned long loop; + struct timespec tmpspec; + + for (loop=0; loop= before.tv_nsec) + dt += (after.tv_nsec - before.tv_nsec) * 1e-9; + else + { + dt -= 1.0; + dt += (before.tv_nsec - after.tv_nsec) * 1e-9; + } + dt *= (double)1e9 / NLOOP / NUNROLL; + + if (best != 0.0) { + if (dt < best) + best = dt; + } + else + best = dt; + } + printf("%s: %.0f ns\n", name, best, NLOOP); +} + +int main() +{ + clockid_t clkid; + int i; + + for (i=0; i