local _M = {} _M.source, _M.resolution, _M.gettime = (function() local has_syscall, syscall = pcall(require, "syscall") if has_syscall and syscall.clock_gettime and syscall.c.CLOCK then local clock_id = syscall.c.CLOCK.REALTIME local function timespec_to_number(timespec) return tonumber(timespec.tv_sec) + tonumber(timespec.tv_nsec) * 1e-9 end return "syscall.clock_gettime(CLOCK_REALTIME)", syscall.clock_getres and timespec_to_number(syscall.clock_getres(clock_id)) or 1e-9, function() return timespec_to_number(syscall.clock_gettime(clock_id)) end end local has_unix, unix = pcall(require, "unix") -- On Apple devices lunix only uses gettimeofday() if has_unix and unix.clock_gettime and unix.uname and unix.uname().sysname ~= "Darwin" then return "unix.clock_gettime(CLOCK_REALTIME)", 1e-9, function() return unix.clock_gettime() end end if has_syscall and syscall.gettimeofday then local function timeval_to_number(timeval) return tonumber(timeval.tv_sec) + tonumber(timeval.tv_nsec) * 1e-6 end return "syscall.gettimeofday()", 1e-6, function() return timeval_to_number(syscall.gettimeofday()) end end if has_unix and unix.gettimeofday then return "unix.gettimeofday()", 1e-6, unix.gettimeofday end local has_socket, socket = pcall(require, "socket") if has_socket and socket.gettime then -- on windows, this uses GetSystemTimeAsFileTime, which has resolution of 1e-7 -- on linux, this uses gettimeofday, which has resolution of 1e-6 return "socket.gettime()", 1e-6, socket.gettime end if ngx and ngx.now then -- luacheck: ignore 113 return "ngx.now()", 1e-3, ngx.now -- luacheck: ignore 113 end return "os.time()", 1, os.time end)() return _M