gpt4 book ai didi

node.js - 每秒奇怪的结果测试操作

转载 作者:太空宇宙 更新时间:2023-11-04 00:03:43 25 4
gpt4 key购买 nike

我在 Node 8.11 上运行此测试脚本:

let end = false;

let i = 0;
setInterval(() => { i++; }).unref();


let k = 0;
async function loop() {
k++
if (end === false)
setImmediate(loop);
}

console.time('test');
loop()
.then(() => {
setTimeout(() => {
end = true;
console.log('interval', i);
console.log('recursion', k);
console.timeEnd('test');
}, 1000);
})

输出是:

interval 997
recursion 824687
test: 1001.831ms

但是,如果我评论这两行:

  // if (end === false)
// setImmediate(loop);

结果是:

interval 537
recursion 1
test: 1003.882ms

我努力学习了phases of nodejs但我不明白为什么 setImmediate 会影响间隔函数的结果。

你有一些解释吗?

谢谢

最佳答案

这是因为nodejs上的定时器并不精确,它们只是事件循环中的事件,因此它们无法确切知道它们何时会被触发,这就是为什么setTimeout说它至少会在您提供的时间之后执行。

The timeout interval that is set cannot be relied upon to execute after that exact number of milliseconds. This is because other executing code that blocks or holds onto the event loop will push the execution of the timeout back. The only guarantee is that the timeout will not execute sooner than the declared timeout interval.

当您设置 setInmediate 时,您将用大量中间事件填充事件循环,因此您将超时事件推回到队列中。

请记住,事件循环周期的时间持续时间不同,因此即使您认为 setInmediate 不应影响计时器,您也会延长事件周期的持续时间。

有趣的文章:

https://nodejs.org/en/docs/guides/timers-in-node/

https://medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and-its-metrics-c4907b19da4c

编辑:正如您所指出的,在您的情况下恰恰相反,使用 setInmediate 时会有更多迭代。在这种情况下,它可能与事件循环的速度有关,该速度是动态的,具体取决于程序的负载。

关于node.js - 每秒奇怪的结果测试操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53412160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com