From 1dc3bc5db3b3ba60399bee4753abe2f78374a2dd Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Tue, 17 Dec 2024 16:10:30 -0500 Subject: pktmr: first-pass, all macros, no IMPL --- pktmr.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 pktmr.h (limited to 'pktmr.h') diff --git a/pktmr.h b/pktmr.h new file mode 100644 index 0000000..9245373 --- /dev/null +++ b/pktmr.h @@ -0,0 +1,27 @@ +#ifndef PK_PKTMR_H +#define PK_PKTMR_H + +#include + +/* 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 */ -- cgit v1.2.3