81 votes

Lua - Heure actuelle en millisecondes

une autre question de Lua: existe-t-il un moyen commun d’obtenir l’heure actuelle en millisecondes ou avec? Il y a os.time() , mais il ne fournit que des secondes complètes.

63voto

waqas Points 2940

J'utilise LuaSocket pour obtenir plus de précision.

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

Cela ajoute une dépendance bien sûr, mais fonctionne très bien pour un usage personnel (dans les scripts d'analyse comparative, par exemple).

59voto

Valerio Schiavoni Points 485

Si vous voulez comparer, vous pouvez utiliser os.clock comme indiqué par le 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))
 

36voto

Kevlar Points 3988

Dans la norme C lua, pas. Vous aurez à régler pour les secondes, sauf si vous êtes prêt à modifier l'interpréteur lua-vous pour avoir os.le temps d'utiliser la résolution que vous voulez. Qui peut être inacceptable, cependant, si vous écrivez du code pour d'autres personnes afin de fonctionner sur leur propre, et pas quelque chose comme une application web où vous avez le plein contrôle de l'environnement.

Edit: une autre option est d'écrire votre propre petite DLL en C qui s'étend lua avec une nouvelle fonction qui vous donnent les valeurs que vous voulez, et exigent que les dll être distribués avec votre code à la personne qui va l'utiliser.

11voto

Cody Duncan Points 41

J'ai fait une solution adaptée pour lua sur Windows. En gros, j'ai fait ce que le Kevlar a suggéré, mais avec une bibliothèque partagée plutôt que d'une DLL. Cela a été testé en utilisant cygwin.

J'ai écrit quelques lua compatible code en C, compilé à une bibliothèque partagée (.si le fichier via gcc dans cygwin), puis chargé dans lua à l'aide de paquet.cpath et d'exiger" que ". A écrit un adaptateur de script pour des raisons de commodité. Ici, c'est tout de la source:

d'abord le code 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;
}

--

--

Maintenant permet de le charger dans un script lua, HighResTimer.lua .

Note: j'ai compilé le HighResTimer.c à une bibliothèque partagée, la Minuterie.donc

#!/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

--

--

et Enfin, utiliser la minuterie, 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: Tous les commentaires ont été écrits après-coller le code source dans l'éditeur d'affiches, de sorte que, techniquement, c'est pas testé, mais j'espère que les commentaires n'ont pas confondre quoi que ce soit. Je ne manquerai pas de revenir et de fournir un correctif si elle n'.

2voto

Doug Currie Points 26016

Le kevlar est correct.

Lua Alien est une alternative à une DLL personnalisée

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X