From af81088cf938f388dac201a90b8ef221ee82aef6 Mon Sep 17 00:00:00 2001 From: Gertjan van den Burg Date: Thu, 6 Oct 2016 17:42:41 +0200 Subject: change timer functionality to use clock_monotonic_raw --- src/gensvm_timer.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) (limited to 'src/gensvm_timer.c') diff --git a/src/gensvm_timer.c b/src/gensvm_timer.c index 04d93b1..0e020fe 100644 --- a/src/gensvm_timer.c +++ b/src/gensvm_timer.c @@ -1,25 +1,45 @@ /** - * @file timer.c + * @file gensvm_timer.c * @author Gertjan van den Burg * @date January, 2014 * @brief Utility functions relating to time * * @details * This file contains a simple function for calculating the time in seconds - * elapsed between two clock() calls. + * elapsed between two Timer() calls. * */ #include "gensvm_timer.h" /** - * @brief Calculate the time between two clocks + * @brief Calculate the time between two time recordings * - * @param[in] s_time starting time - * @param[in] e_time end time + * @detail + * This function should be used with time recordings done by clock_gettime() + * using CLOCK_MONOTONIC_RAW. For this, the Timer() macro has been defined in + * the header file. Example usage: + * + * @code + * struct timespec start, stop; + * Timer(start); + * // do some work // + * Timer(stop); + * double duration = gensvm_elapsed_time(&start, &stop); + * @endcode + * + * This approach to measuring time has been chosen since CLOCK_MONOTONIC_RAW + * is guaranteed to be monotonically increasing, and is not affected by leap + * seconds or other changes to the system clock. It is therefore thread-safe + * and can be used to accurately measure time intervals. + * + * @param[in] start starting time + * @param[in] stop end time * @returns time elapsed in seconds */ -double gensvm_elapsed_time(clock_t s_time, clock_t e_time) +double gensvm_elapsed_time(struct timespec *start, struct timespec *stop) { - return ((double) (e_time - s_time))/((double) CLOCKS_PER_SEC); + double delta_s = stop->tv_sec - start->tv_sec; + double delta_ns = stop->tv_nsec - start->tv_nsec; + return delta_s + delta_ns * 1e-9; } -- cgit v1.2.3