#define _POSIX_C_SOURCE 199309L
#include <assert.h>
#include <time.h>
#define GIGA 1000000000
#define NUM_ITER 100000
static struct
{
struct timespec start;
struct timespec end;
long nstops;
long long total_time;
long long total_overhead;
} stopwatch = {.nstops = 0, .total_time = 0, .total_overhead = 0};
void stopwatch_reset(void)
{
stopwatch.nstops = 0;
stopwatch.total_time = 0;
stopwatch.total_overhead = 0;
for (int i = 0; i < NUM_ITER; i++)
{
assert(clock_gettime(CLOCK_MONOTONIC, &stopwatch.start) == 0);
assert(clock_gettime(CLOCK_MONOTONIC, &stopwatch.end) == 0);
stopwatch.total_overhead +=
(stopwatch.end.tv_sec - stopwatch.start.tv_sec) * GIGA + (stopwatch.end.tv_nsec - stopwatch.start.tv_nsec);
}
stopwatch.total_overhead /= NUM_ITER;
}
void stopwatch_start(void)
{
assert(clock_gettime(CLOCK_MONOTONIC, &stopwatch.start) == 0);
}
void stopwatch_stop(void)
{
assert(clock_gettime(CLOCK_MONOTONIC, &stopwatch.end) == 0);
stopwatch.nstops++;
stopwatch.total_time += (stopwatch.end.tv_sec - stopwatch.start.tv_sec) * GIGA +
(stopwatch.end.tv_nsec - stopwatch.start.tv_nsec) - stopwatch.total_overhead;
}
long long stopwatch_read(void)
{
assert(stopwatch.nstops > 0);
return (stopwatch.total_time / stopwatch.nstops);
}