Lua-текущее время в миллисекундах

есть ли простой способ получить текущее время в миллисекундах?

здесь os.time(), но он обеспечивает только полные секунды.

9 ответов


в стандартном C lua, нет. Вам придется довольствоваться секундами, если вы не хотите изменить интерпретатор lua самостоятельно, чтобы иметь ОС.время используйте разрешение, которое вы хотите. Это может быть неприемлемо, однако, если вы пишете код для других людей, чтобы работать самостоятельно, а не что-то вроде веб-приложения, где у вас есть полный контроль над средой.

Edit: другой вариант-написать свою собственную небольшую DLL в C, которая расширяет lua с новой функцией, которая даст вам значения, которые вы хотите, и требуют, чтобы dll распространялась с вашим кодом тому, кто будет его использовать.


Я использую LuaSocket для получения большей точности.

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

это, конечно, добавляет зависимость, но отлично работает для личного использования (например, в сценариях бенчмаркинга).


Если вы хотите проверить, вы можете использовать ОС.часы, как показано в doc:

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))

Я сделал подходящее решение для lua на Windows. Я в основном сделал то, что предложил кевлар, но с общей библиотекой, а не с DLL. Это было протестировано с помощью cygwin.

Я написал некоторый совместимый с lua код C, скомпилировал его в общую библиотеку (.Итак, файл через gcc в cygwin), а затем загрузил его в lua с помощью пакета.cpath и требуют" ". Написал скрипт адаптера для удобства. Вот весь источник:

сначала код C, Хайрестаймер.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.Луа .

Примечание: я скомпилировал HighResTimer.c в общую библиотеку, таймер.так что

#!/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.Луа .

#!/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");

Примечание: любые комментарии были написаны после вставки исходного кода в Редактор сообщений, поэтому технически это непроверено, но надеюсь, комментарии ничего не сбили с толку. Я обязательно вернусь и предоставлю исправление, если это произойдет.


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 / время.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

гнездо.методов gettime()

http://w3.impa.br / ~diego / программное обеспечение / luasocket / сокет.html#gettime

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

as waqas говорит


сравнить & тест

get_millisecond.Луа!--19-->

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 с nginx / openresty, вы можете использовать фабриката необходмо предусмотреть.сейчас(), который возвращает float с точностью до миллисекунды


в openresty есть функция фабриката необходмо предусмотреть.запрос.значение start_time.

документы:

возвращает число с плавающей запятой, представляющее метку времени (включая миллисекунды в качестве десятичной части) при создании текущего запроса.


вы можете использовать функцию C gettimeofday : http://www.opengroup.org/onlinepubs/000095399/functions/gettimeofday.html

здесь библиотека c "ul_time", функция sec_usec находится в глобальной таблице "time" и возвращает секунды, useconds. Скопируйте DLL в папку Lua, откройте ее с помощью require 'ul_time'.

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