summaryrefslogtreecommitdiff
path: root/pktmr.h
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 */