【问题标题】:Why is this node setInterval running slow?为什么这个节点 setInterval 运行缓慢?
【发布时间】:2021-05-03 15:41:00
【问题描述】:

以下代码使用setInterval 每16ms 递增一次tick 并记录每秒的滴答数。我预计这会报告每秒约 60 个滴答声(如 1000 毫秒 / 16 毫秒 = 约 60 个),但我看到的是大约 35-40 个。这是在最小负载(节点 v14.5.4)下的强大 Windows 桌面上。在浏览器中运行相同的代码会产生预期的结果。

let lastTick = 0;
let tick = 0;

setInterval(()=>{
    tick++;
}, 16);

setInterval(()=>{
    console.log("ticks per second: " + (tick-lastTick));
    lastTick = tick;
}, 1000);

我错过了什么?

更新

因此,使用 node --inspect 运行,然后对 javascript 进行分析可以将值提高到每秒 60,但仅在分析器运行时。一定是某种奇怪的 CPU 限制在低 CPU 进程上,但我找不到任何原因。

【问题讨论】:

  • 首先,the timers aren't precise。以超时延迟为最小值。其次,还有没有其他繁重的操作发生?
  • 你的代码没问题。我在我的机器上对其进行了测试,它连续打印6061。您必须检查机器中的其他进程。
  • 感谢您的编辑。代码是唯一运行的东西;从字面上看,上面的副本粘贴到 timer.js 中,然后在 i9-9990k 上使用node timer 运行。它的运行时间比我预期的慢了整整 10 毫秒,我知道 Node 没有很高的精度,但这似乎很极端!
  • 很奇怪,浏览器很高兴地给我每秒 60 个,但节点只达到每秒 40 个。

标签: node.js setinterval


【解决方案1】:

我无法证明这一点,但有趣的是,Chrome 似乎在数十毫秒范围内的时间间隔内执行相当可靠,因为它正在执行更多工作(渲染页面、读取用户输入等),因此不会违反 CPU 调度和缺少 setInterval 刻度的“正确”时间窗口。除了定期运行提供的代码之外没有做太多事情的节点会被取消调度,因此会错过它的时间间隔。

这一理论得到以下事实的支持:增加节点正在做的工作(即运行分析器或在滴答之间添加更多不相关的工作)提高 setInterval 滴答声。

由于节点在 ms 范围内没有可靠的计时功能(除了使用 setImmediate 运行紧密循环),我已将计时工作卸载到另一个系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2021-12-20
    • 2012-10-02
    相关资源
    最近更新 更多