Lua – 当前时间(以毫秒为单位)

有没有一个常用的方法来获取当前时间或以毫秒为单位?

os.time() ,但它只提供完整的秒。

在标准的C lua,没有。 除非你愿意自己修改lua解释器让os.time使用你想要的解决scheme,否则你将不得不安排好几秒钟。 但是,如果您正在编写其他人自行运行的代码,而不是您完全控制环境的Web应用程序,那么这可能是不可接受的。

编辑:另一种select是在C编写自己的小DLL,扩展lua与一个新的function,会给你你想要的值,并要求与你的代码分发给任何人将使用它的DLL。

我使用LuaSocket来获得更多的精度。

 require "socket" print("Milliseconds: " .. socket.gettime()*1000) 

这当然会增加依赖性,但对于个人使用(例如基准脚本)来说工作良好。

如果你想基准testing,你可以使用os.clock,如文档所示:

 local x = os.clock() local s = 0 for i=1,100000 do s = s + i end print(string.format("elapsed time: %.2f\n", os.clock() - x)) 

我在Windows上为lua做了一个合适的解决scheme。 我基本上做了凯夫拉尔build议,但共享库,而不是一个DLL。 这已经使用cygwin进行了testing。

我写了一些与lua兼容的C代码,将它编译成一个共享库(通过gcc在cygwin中的.so文件),然后使用package.cpath将其加载到lua中,并且需要“”。 为了方便写了一个适配器脚本。 这里是所有的来源:

首先是C代码,HighResTimer.c

 //////////////////////////////////////////////////////////////// //HighResTimer.c by Cody Duncan // //compile with: gcc -o Timer.so -shared HighResTimer.c -llua5.1 //compiled in cygwin after installing lua (cant remember if I // installed via setup or if I downloaded and compiled lua, // probably the former) //////////////////////////////////////////////////////////////// #include <windows.h> typedef unsigned __int64 u64; double mNanoSecondsPerCount; #include "lua.h" #include "lualib.h" #include "lauxlib.h" int prevInit = 0; int currInit = 0; u64 prevTime = 0; u64 currTime = 0; u64 FrequencyCountPerSec; LARGE_INTEGER frequencyTemp; static int readHiResTimerFrequency(lua_State *L) { QueryPerformanceFrequency(&frequencyTemp); FrequencyCountPerSec = frequencyTemp.QuadPart; lua_pushnumber(L, frequencyTemp.QuadPart); return 1; } LARGE_INTEGER timerTemp; static int storeTime(lua_State *L) { QueryPerformanceCounter(&timerTemp); if(!prevInit) { prevInit = 1; prevTime = timerTemp.QuadPart; } else if (!currInit) { currInit = 1; currTime = timerTemp.QuadPart; } else { prevTime = currTime; currTime = timerTemp.QuadPart; } lua_pushnumber(L, timerTemp.QuadPart); return 1; } static int getNanoElapsed(lua_State *L) { double mNanoSecondsPerCount = 1000000000/(double)FrequencyCountPerSec; double elapsedNano = (currTime - prevTime)*mNanoSecondsPerCount; lua_pushnumber(L, elapsedNano); return 1; } int luaopen_HighResolutionTimer (lua_State *L) { static const luaL_reg mylib [] = { {"readHiResTimerFrequency", readHiResTimerFrequency}, {"storeTime", storeTime}, {"getNanoElapsed", getNanoElapsed}, {NULL, NULL} /* sentinel */ }; luaL_register(L,"timer",mylib); return 1; } 

现在让我们把它加载到一个lua脚本HighResTimer.lua中。

注意:我将HighResTimer.c编译为共享库Timer.so

 #!/bin/lua ------------------------------------ ---HighResTimer.lua by Cody Duncan ---Wraps the High Resolution Timer Functions in --- Timer.so ------------------------------------ package.cpath = "./Timer.so" --assuming Timer.so is in the same directory require "HighResolutionTimer" --load up the module timer.readHiResTimerFrequency(); --stores the tickFrequency --call this before code that is being measured for execution time function start() timer.storeTime(); end --call this after code that is being measured for execution time function stop() timer.storeTime(); end --once the prior two functions have been called, call this to get the --time elapsed between them in nanoseconds function getNanosElapsed() return timer.getNanoElapsed(); end 

最后,使用定时器TimerTest.lua。

 #!/bin/lua ------------------------------------ ---TimerTest.lua by Cody Duncan --- ---HighResTimer.lua and Timer.so must --- be in the same directory as --- this script. ------------------------------------ require './HighResTimer' start(); for i = 0, 3000000 do io.write("") end --do essentially nothing 3million times. stop(); --divide nanoseconds by 1 million to get milliseconds executionTime = getNanosElapsed()/1000000; io.write("execution time: ", executionTime, "ms\n"); 

注意:任何评论都是在将源代码粘贴到post编辑器之后编写的,所以在技术上这是未经testing的,但是希望评论没有任何困难。 如果是的话,我一定会回来的。

lua得到毫秒

os.time()

 os.time() return sec //only 

posix.lock_gettime(CLK)

https://luaposix.github.io/luaposix/modules/posix.time.html#clock_gettime

 require'posix'.clock_gettime(0) return sec, nsec 

linux / time.h // man clock_gettime

 /* * The IDs of the various system clocks (for POSIX.1b interval timers): */ #define CLOCK_REALTIME 0 #define CLOCK_MONOTONIC 1 #define CLOCK_PROCESS_CPUTIME_ID 2 #define CLOCK_THREAD_CPUTIME_ID 3 #define CLOCK_MONOTONIC_RAW 4 #define CLOCK_REALTIME_COARSE 5 #define CLOCK_MONOTONIC_COARSE 6 

socket.gettime()

http://w3.impa.br/~diego/software/luasocket/socket.html#gettime

 require'socket'.gettime() return sec.xxx 

waqas


比较和testing

get_millisecond.lua

 local posix=require'posix' local socket=require'socket' for i=1,3 do print( os.time() ) print( posix.clock_gettime(0) ) print( socket.gettime() ) print'' posix.nanosleep(0, 1) -- sec, nsec end 

产量

 lua get_millisecond.lua 1490186718 1490186718 268570540 1490186718.2686 1490186718 1490186718 268662191 1490186718.2687 1490186718 1490186718 268782765 1490186718.2688 

凯夫拉尔是正确的。

自定义DLL的替代方法是Lua Alien

如果你用nginx / openresty使用lua,你可以使用ngx.now() ,它返回一个毫秒精度的float

你可以使用C函数gettimeofday: http : //www.opengroup.org/onlinepubs/000095399/functions/gettimeofday.html

这里C库'ul_time',函数sec_usec驻留在'time'全局表中,并返回seconds,useconds。 复制DLL到Lua文件夹,用require'ul_time'打开它。

http://depositfiles.com/files/3g2fx7dij

在openresty中有一个函数ngx.req.start_time 。

从文档:

当创build当前请求时,返回表示时间戳的浮点数(包括以毫秒为单位的小数部分)。