Hi, Sergey! thanks for the patch! Please see my comments. Sergey On 10/24/25 13:50, Sergey Kaplun wrote: > This module contains 2 functions: > - `realtime()` -- returns the time represented by the wall clock. > - `process_cputime()` -- returns the time consumed by all threads of > the process. I would rephrase second bullet: "to measure CPU time instead of elapsed time" Also, I would add this description to the Lua module as well. > > 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..57385967 > --- /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  This clock is not a reliable source of the time. This clock can be adjusted by NTP or manually or by timezones. It is better to use CLOCK_MONOTONIC or even CLOCK_MONOTONIC_RAW (not portable, Linux-specific), it is more reliable and does not depend on things listed above. > +-- CPU time consumed by the process. > +local CLOCK_PROCESS_CPUTIME_ID = 2 > + > +-- All functions below returns the corresponding `clock_gettime()` s/`clock_gettime()`/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 > + may be it is better to make conversion only once? @@ -24,7 +24,7 @@ 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 +  return tonumber(timespec[0].tv_sec + timespec[0].tv_nsec / 1e9)  end the same below > +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