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