Hi, Sergey!
thanks for the patch! Please see my comments.
Sergey
I would rephrase second bullet: "to measure CPU time instead of elapsed time"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.
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.
s/`clock_gettime()`/elapsed time/+-- CPU time consumed by the process. +local CLOCK_PROCESS_CPUTIME_ID = 2 + +-- All functions below returns the corresponding `clock_gettime()`
+-- 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