blob: 69cd9d0d7de31973d3208d8ab8a888cfce358df0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
/**
* @file gensvm_timer.c
* @author G.J.J. van den Burg
* @date 2014-01-07
* @brief Utility functions relating to time
*
* @details
* This file contains a simple function for calculating the time in seconds
* elapsed between two Timer() calls.
*
* @copyright
Copyright 2016, G.J.J. van den Burg.
This file is part of GenSVM.
GenSVM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
GenSVM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GenSVM. If not, see <http://www.gnu.org/licenses/>.
*/
#include "gensvm_timer.h"
/**
* @brief Calculate the time between two time recordings
*
* @details
* 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(struct timespec *start, struct timespec *stop)
{
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;
}
|