Lua微秒级睡眠。

好的,我需要在我的 Lua 脚本中等待 10 微秒,有没有办法做到?

目前,我使用这个简单的(非忙等待)函数使用 socket

function my_utils.sleep(sec)
    socket.select(nil, nil, sec)
end

但是它似乎 “休眠最小值” 是毫秒。

示例 1:

for x=0,2*math.pi,0.008 do
    misc.printus()
    misc.sleep(0.001)
end

输出:

0.022654
0.023654
0.024654
0.025654
0.026654
0.027654
0.028654
0.029654
0.030654
0.031654
0.032654
...

不错!

示例 2:

for x=0,2*math.pi,0.008 do
    misc.printus()
    misc.sleep(0.0001)
end

输出:

0.537089
0.537089
0.537089
0.537089
... --(大量)
38089
0.538089
0.538089
0.538089
0.538089
0.538089
0.538089
... --(大量)
0.538089
0.577091 --(跳了0.04秒!)
0.577091
0.577091
0.577091
0.577091
... --(等等)

有人能给我一些解释(以及关于0.04秒的跳跃)吗?

点赞
用户1881196
用户1881196

Lua使用操作系统提供的时间服务。可用的分辨率通常不是很高,而且在Lua层面上被认为是时间跳跃。

想象一个带有分钟分辨率的挂钟。它无法用来测量毫秒间隔。

2015-05-26 07:14:07
用户2765603
用户2765603

除了操作系统时间的抖动外,lua使用垃圾收集器来管理其内存,该收集器将定期运行。在其运行过程中,所有其他操作都会延迟(尽管延迟应该相当短)。根据程序中的分配量,很可能您的代码会在这种GC暂停时发生错误。

2015-05-26 08:47:28