blob: 9245373c9cf3f07fde116c6e3d912371a741b82c (
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
|
#ifndef PK_PKTMR_H
#define PK_PKTMR_H
#include <time.h>
/* 2024-12-17 JCB
* I have read that in more recent Linux kernels, _MONOTONIC and _REALTIME
* do not require syscalls, while all of the other calls can.
* In testing on my personal machine, this seems to hold true. Using
* CLOCK_PROCESS_CPUTIME_ID consistently elapsed thousands of nanoseconds,
* even with no work between sequential _start() and _stop() calls.
* Meanwhile, the same test with _MONOTONIC elapsed only tens of nanoseconds.
* Consider replacing explicit usage with a define for more user control.
*/
/* struct pk_tmr */
struct pk_tmr {
struct timespec b; // begin
struct timespec e; // end
};
#define pk_tmr_start(tmr) { clock_gettime(CLOCK_MONOTONIC, &tmr.b); }
#define pk_tmr_stop(tmr) { clock_gettime(CLOCK_MONOTONIC, &tmr.e); }
#define pk_tmr_duration_double(tmr) ((1000.0 * tmr.e.tv_sec + 1e-6 * tmr.e.tv_nsec) - (1000.0 * tmr.b.tv_sec + 1e-6 * tmr.b.tv_nsec))
#define pk_tmr_duration_nano(tmr) ((((uint64_t)tmr.e.tv_sec * (uint64_t)1000000000) + tmr.e.tv_nsec) - (((uint64_t)tmr.b.tv_sec * (uint64_t)1000000000) + (uint64_t)tmr.b.tv_nsec))
#endif /* PK_PKTMR_H */
|