// timespec.c: benchmark a code snippet // (c) 2016-2019 by Jens Gustedt, MIT License // (c) 2020 by Federico Lucifredi #include #include #include #include #include #include #include #include "stats.h" double timespec_diff(struct timespec const* later, struct timespec const* sooner){ /* Be careful: tv_sec could be an unsigned type */ if (later->tv_sec < sooner->tv_sec) return -timespec_diff(sooner, later); else return (later->tv_sec - sooner->tv_sec) /* tv_nsec is known to be a signed type. */ + (later->tv_nsec - sooner->tv_nsec) * 1E-9; } int main(int argc, char* argv[argc+1]) { if (argc < 2) { fprintf(stderr, "Usage: %s NNN, NNN iterations\n", argv[0]); return EXIT_FAILURE; } enum { probes = 10, loops = 1, }; uint64_t iterations = strtoull(argv[1], 0, 0); uint64_t upper = iterations*iterations; double pi = M_PI; double r = 0.0; stats statistic[loops] = { 0 }; struct timespec tdummy; stats sdummy[4] = { 0 }; for (unsigned probe = 0; probe < probes; ++probe) { uint64_t accu0 = 0; uint64_t accu1 = 0; struct timespec t[loops+1] = { 0 }; timespec_get(&t[0], TIME_UTC); /* Volatile for i ensures that the loop is effected */ for (uint64_t volatile i = 0; i < iterations; ++i) { r = round(pi); } timespec_get(&t[1], TIME_UTC); for (unsigned i = 0; i < loops; i++) { double diff = timespec_diff(&t[i+1], &t[i]); stats_collect2(&statistic[i], diff); } } for (unsigned i = 0; i < loops; i++) { double mean = stats_mean(&statistic[i]); double rsdev = stats_rsdev_unbiased(&statistic[i]); printf("loop %u: E(t) (sec):\t%5.2e