Lua - 当前时间的毫秒数
有没有一种通用方法来获得当前时间,包括毫秒?
有 os.time(),但它只提供完整的秒数。
我使用 LuaSocket 来获得更精确的时间。
require "socket"
print("Milliseconds: " .. socket.gettime()*1000)
当然,这样做会增加依赖,但在个人使用中(例如在基准测试脚本中),效果很好。
你可以使用 C 函数 gettimeofday:
http://www.opengroup.org/onlinepubs/000095399/functions/gettimeofday.html
这里有一个名为 ul_time 的 C 库,其中的函数 sec_usec 存在于 'time' 全局表中,并返回秒数和微秒数。将 DLL 文件复制到 Lua 文件夹中,然后使用 require 'ul_time' 打开它。
如果您想要进行基准测试,可以使用文档中所示的 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))
获取当前毫秒数。
os.time()
os.time()
return sec // 只返回秒数
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
/*
 * 各种系统时钟的 ID(用于 POSIX.1b 间隔计时器):
 */
#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 所说
比较和测试
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
如果你正在使用 OpenResty,那么它通过使用 ngx.now() 函数提供了内置的毫秒级时间精度。虽然如果你想要更细粒度的毫秒级精度,那么你可能需要先调用 ngx.update_time()。或者,如果你想更进一步...
如果你正在使用启用了 luajit 的环境,比如 OpenResty,那么你还可以使用 ffi 访问基于 C 的时间函数,如 gettimeofday() 例如:(注意:如果你通过 OpenResty 中的 content_by_lua_file 反复运行它,那么 pcall 检查 struct timeval 是否存在是必要的 - 如果没有它,你会遇到诸如 attempt to redefine 'timeval' 的错误)
if pcall(ffi.typeof, "struct timeval") then
        -- 检查是否已定义。
else
        -- 未定义!让我们定义它!
        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
那么,新的 lua gettimeofday() 函数可以从 lua 中调用,以提供到 微秒 级别的时钟时间精度。
实际上,可以采用类似的方法使用 clock_gettime() 来获得 纳秒 精度。
如果你的环境是 Windows 并且你可以访问系统命令,你可以使用 io.popen(command) 命令以分毫秒精度获取时间:
local handle = io.popen("echo %time%")
local result = handle:read("*a")
handle:close()
结果将会是 hh:mm:ss.cc 格式的字符串:(包括行尾换行符)
"19:56:53.90\n"
请注意,它是在本地时区,因此您可能只想提取 .cc 部分,并将其与 os.time() 中的纪元秒组合。
如果你在一个可执行 GNU 兼容实现的 date 系统上,这里是一个一行的代码获取毫秒级别的 Epoch 时间:
local function gethammertime()
  return tonumber(assert(assert(io.popen'date +%s%3N'):read'a'))
end
请注意,assert 调用是必要的,以确保读取或打开 date 的任何失败都会分别传播错误。还要注意,这依赖于垃圾收集(或在 Lua 5.4 中的 finalizers)来关闭进程句柄:如果使用早于 5.4 版本的 Lua,并且担心资源耗尽问题,您可能需要像 Klesun 的基于 Windows 的答案 一样将其扩展为三行,并显式关闭句柄。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
 - 如何在roblox studio中1:1导入真实世界的地形?
 - 求解,lua_resume的第二次调用继续执行协程问题。
 - 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
 - SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
 - Lua实现网站后台开发
 - LUA错误显式返回,社区常见的规约是怎么样的
 - lua5.3下载库失败
 - 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
 - lua lanes多线程使用
 - 一个kv数据库
 - openresty 有没有比较轻量的 docker 镜像
 - 想问一下,有大佬用过luacurl吗
 - 在Lua执行过程中使用Load函数出现问题
 - 为什么 neovim 里没有显示一些特殊字符?
 - Lua比较两个表的值(不考虑键的顺序)
 - 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
 - 如何在 Visual Studio 2022 中运行 Lua 代码?
 - addEventListener 返回 nil Lua
 - Lua中获取用户配置主目录的跨平台方法
 
在标准的C lua中不行。除非你愿意修改lua解释器,让os.time使用你想要的精度,否则你只能接受秒。然而,如果你写的代码是给其他人在他们自己的环境中运行而不是像网络应用一样完全掌控环境,那可能是无法接受的。
编辑:另一个选择是用C编写自己的小型DLL,扩展lua的一个新函数,可以给你想要的值,并要求将该dll与你的代码一起分发给使用它的人。