Hi, Sergey! Thanks for the patch! LGTM after submitting a new issue about investigating CLOCK_REALTIME drawbacks Sergey On 12/26/25 12:17, Sergey Kaplun wrote: > This module contains 2 functions: > - `realtime()` -- returns the time represented by the wall clock. > - `process_cputime()` -- measures the CPU time instead of elapsed time. > > Both functions are implemented via FFI call to the `clock_gettime()`. > --- > perf/utils/clock.lua | 35 +++++++++++++++++++++++++++++++++++ > 1 file changed, 35 insertions(+) > create mode 100644 perf/utils/clock.lua > > diff --git a/perf/utils/clock.lua b/perf/utils/clock.lua > new file mode 100644 > index 00000000..cf708194 > --- /dev/null > +++ b/perf/utils/clock.lua > @@ -0,0 +1,35 @@ > +local ffi = require('ffi') > + > +ffi.cdef[[ > +struct timespec { > + long tv_sec; /* Seconds. */ > + long tv_nsec; /* Nanoseconds. */ > +}; > + > +int clock_gettime(int clockid, struct timespec *tp); > +]] > + > +local C = ffi.C > + > +-- Wall clock. > +local CLOCK_REALTIME = 0 > +-- CPU time consumed by the process. > +local CLOCK_PROCESS_CPUTIME_ID = 2 > + > +-- All functions below returns the corresponding elapsed time in > +-- seconds. > +local M = {} > + > +local timespec = ffi.new('struct timespec[1]') > + > +function M.realtime() > + C.clock_gettime(CLOCK_REALTIME, timespec) > + return tonumber(timespec[0].tv_sec) + tonumber(timespec[0].tv_nsec) / 1e9 > +end > + > +function M.process_cputime() > + C.clock_gettime(CLOCK_PROCESS_CPUTIME_ID, timespec) > + return tonumber(timespec[0].tv_sec) + tonumber(timespec[0].tv_nsec) / 1e9 > +end > + > +return M