Lua-현재 시간 (밀리 초)
밀리 초 단위 또는 단위로 현재 시간을 가져 오는 일반적인 방법이 있습니까?
이 os.time()
있지만 전체 초만 제공합니다.
표준 C lua에서는 그렇지 않습니다. os.time이 원하는 해상도를 사용하도록 lua 인터프리터를 직접 수정하지 않는 한 몇 초 동안 만족해야합니다. 그러나 환경을 완전히 제어 할 수있는 웹 응용 프로그램과 같은 것이 아니라 다른 사람이 스스로 실행할 수있는 코드를 작성하는 경우 허용되지 않을 수 있습니다.
편집 : 또 다른 옵션은 원하는 값을 제공하는 새로운 기능으로 lua를 확장하는 C로 자신의 작은 DLL을 작성하고 dll을 코드와 함께 사용할 사람에게 배포하도록 요구하는 것입니다.
더 많은 정밀도를 얻기 위해 LuaSocket을 사용합니다.
require "socket"
print("Milliseconds: " .. socket.gettime()*1000)
이것은 물론 종속성을 추가하지만 개인적인 용도 (예 : 벤치마킹 스크립트)에서는 잘 작동합니다.
벤치마킹하려면 문서에 표시된대로 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에 적합한 솔루션을 만들었습니다. 기본적으로 Kevlar가 제안한 것을 수행했지만 DLL이 아닌 공유 라이브러리를 사용했습니다. 이것은 cygwin을 사용하여 테스트되었습니다.
lua 호환 C 코드를 작성하고 공유 라이브러리 (cygwin에서 gcc를 통해 .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");
Note: Any comments were written after pasting the source code into the post editor, so technically this is untested, but hopefully the comments didn't befuddle anything. I will be sure to come back and provide a fix if it does.
Get current time in milliseconds.
os.time()
os.time()
return sec // only
posix.clock_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
as waqas
says
compare & test
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
output
lua get_millisecond.lua
1490186718
1490186718 268570540
1490186718.2686
1490186718
1490186718 268662191
1490186718.2687
1490186718
1490186718 268782765
1490186718.2688
Kevlar is correct.
An alternative to a custom DLL is Lua Alien
If you're using lua with nginx/openresty you could use ngx.now() which returns a float with millisecond precision
in openresty there is a function ngx.req.start_time.
From the docs:
Returns a floating-point number representing the timestamp (including milliseconds as the decimal part) when the current request was created.
If you're using a luajit enabled environment such as OpenResty then you can use ffi to access C based time functions such as gettimeofday()
e.g: (Note: The pcall
check for the existence of struct timeval
is only necessary if you're running it repeatedly e.g. via content_by_lua_file
in OpenResty - without it you run into errors such as attempt to redefine 'timeval'
)
if pcall(ffi.typeof, "struct timeval") then
-- check if already defined.
else
-- undefined! let's define it!
ffi.cdef[[
typedef struct timeval {
long tv_sec;
long tv_usec;
} timeval;
int gettimeofday(struct timeval* t, void* tzp);
]]
end
local gettimeofday_struct = ffi.new("struct timeval")
local function gettimeofday()
ffi.C.gettimeofday(gettimeofday_struct, nil)
return tonumber(gettimeofday_struct.tv_sec) * 1000000 + tonumber(gettimeofday_struct.tv_usec)
end
Then the new lua gettimeofday()
function can be called from lua to provide the clock time to microsecond level accuracy.
Indeed, one could take a similar approaching using clock_gettime() to obtain nanosecond accuracy.
You can use C function gettimeofday : http://www.opengroup.org/onlinepubs/000095399/functions/gettimeofday.html
Here C library 'ul_time', function sec_usec resides in 'time' global table and returns seconds, useconds. Copy DLL to Lua folder, open it with require 'ul_time'.
http://depositfiles.com/files/3g2fx7dij
참고URL : https://stackoverflow.com/questions/463101/lua-current-time-in-milliseconds
'Programing' 카테고리의 다른 글
Rails 4의 has_many 'conditions'옵션과 동일한 것은 무엇입니까? (0) | 2020.11.07 |
---|---|
절대 위치 지정을 사용하는 것이 나쁜 습관으로 간주됩니까? (0) | 2020.11.07 |
PowerShell을 사용하여 FTP로 파일 업로드 (0) | 2020.11.07 |
노드가 'N'인 경우 가능한 이진 및 이진 검색 트리는 몇 개입니까? (0) | 2020.11.07 |
Scala-배열 인쇄 (0) | 2020.11.07 |