Lua微秒睡眠

Posted

技术标签:

【中文标题】Lua微秒睡眠【英文标题】:Lua microseconds sleep 【发布时间】:2015-05-26 06:47:08 【问题描述】:

好的,我需要在我的 lua 脚本中等待(例如)10 us。有什么办法吗?

现在我使用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
... --(lots of)
38089
0.538089
0.538089
0.538089
0.538089
0.538089
0.538089
... --(lots of)
0.538089
0.577091 -- (jumps over 0.04 second!)
0.577091
0.577091
0.577091
0.577091
... --(and so on)

谁能给我一些解释(大约 0.04 秒的跳跃)?

【问题讨论】:

【参考方案1】:

Lua 使用操作系统提供的时间服务。可用的分辨率通常不是很高,并且在 Lua 级别被感知为时间跳跃。

想象一个具有分钟分辨率的挂钟。它不能用于测量毫秒间隔。

【讨论】:

没错。我使用 C 进行了一些测试,我看到了相同的图片。我现在使用的是 Windows 7,正如我现在所想的那样,在 Windows 中你无法获得超过 1 毫秒的计时器分辨率。 嗯,有一种方法可以在 Windows 上获得高时间精度(参见 ***.com/questions/1825720/…),但它不可移植,因此在 Lua 中不可用。 如果您习惯在 Windows 上编写和编译 C,编写一个 C 库来访问 Window 的高性能计数器非常容易。【参考方案2】:

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

【讨论】:

以上是关于Lua微秒睡眠的主要内容,如果未能解决你的问题,请参考以下文章

在SysTick微秒及毫秒程序举例中,定时器一次最大定时时间是多少毫秒?

一微秒等于多少秒?一微秒等于多少毫秒?

一微妙等于多少秒?

如何获得 MySQL 毫秒,微秒

为啥微秒时间戳使用(私有)gettimeoftheday()重复,即纪元

在微秒内生成哔哔声c#