为什么这个节点 setInterval 运行 慢?
Why is this node setInterval running slow?
以下代码使用 setInterval
每 16 毫秒增加一次 tick
并记录每秒的滴答数。我期望这会报告每秒约 60 个滴答声(如 1000 毫秒/16 毫秒 = ~60),但我看到的是大约 35-40。这是在负载最小的强大 windows 桌面上(节点 v14.5.4)。 运行 浏览器中的相同代码产生了预期的结果。
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 进程上节流,但我找不到任何原因。
我无法证明这一点,但有趣的是 Chrome 似乎在几十毫秒范围内的间隔内相当可靠地执行,因为它正在执行更多的工作(呈现页面、读取用户输入等),所以没有违反 CPU 调度并错过了 'correct' 时间 window setInterval tick。节点没有做太多超出 运行 定期提供的代码被取消计划,因此错过了它的间隔。
这一理论得到以下事实的支持:增加 节点正在执行的工作(即 运行 分析器或在滴答之间添加更多不相关的工作)提高 setInterval 滴答的频率。
由于节点在 ms 范围内没有可靠的计时功能(除了 运行 setImmediate 的紧密循环)我已经将计时工作卸载到另一个系统。
以下代码使用 setInterval
每 16 毫秒增加一次 tick
并记录每秒的滴答数。我期望这会报告每秒约 60 个滴答声(如 1000 毫秒/16 毫秒 = ~60),但我看到的是大约 35-40。这是在负载最小的强大 windows 桌面上(节点 v14.5.4)。 运行 浏览器中的相同代码产生了预期的结果。
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 进程上节流,但我找不到任何原因。
我无法证明这一点,但有趣的是 Chrome 似乎在几十毫秒范围内的间隔内相当可靠地执行,因为它正在执行更多的工作(呈现页面、读取用户输入等),所以没有违反 CPU 调度并错过了 'correct' 时间 window setInterval tick。节点没有做太多超出 运行 定期提供的代码被取消计划,因此错过了它的间隔。
这一理论得到以下事实的支持:增加 节点正在执行的工作(即 运行 分析器或在滴答之间添加更多不相关的工作)提高 setInterval 滴答的频率。
由于节点在 ms 范围内没有可靠的计时功能(除了 运行 setImmediate 的紧密循环)我已经将计时工作卸载到另一个系统。