为什么 Node.js 事件循环在空闲时这么慢?
Why is the Node.js Event Loop so slow on idle?
也许我对事件循环的理解有误,但似乎通过事件循环 1000 轮需要超过 1000 毫秒。
const { performance } = require('perf_hooks');
let counter = 0;
const timestamp_start = performance.now();
increment();
function increment() {
if (counter === 1000) {
console.log(`${Math.round(performance.now() - timestamp_start)}ms`); // -> 1186ms
}
else {
counter++;
setTimeout(increment, 0);
}
}
这是预期的行为吗? node进程一直在做什么? xD
这里的问题是,你指望setTimeout(fn,0)
尽快开火。不是这样的,嗯,至少不是一直这样。
在 chromium 和 node there used to be a 1ms minimum timeout, apparently it's in the process of being removed in chromium (https://crbug.com/402694) 中,但我相信即使是最新的 nodejs 也仍然有它。
无延迟挂钩事件循环的更好方法是使用 setImmediate
方法,您会看到整个循环大约需要 20 毫秒。
也许我对事件循环的理解有误,但似乎通过事件循环 1000 轮需要超过 1000 毫秒。
const { performance } = require('perf_hooks');
let counter = 0;
const timestamp_start = performance.now();
increment();
function increment() {
if (counter === 1000) {
console.log(`${Math.round(performance.now() - timestamp_start)}ms`); // -> 1186ms
}
else {
counter++;
setTimeout(increment, 0);
}
}
这是预期的行为吗? node进程一直在做什么? xD
这里的问题是,你指望setTimeout(fn,0)
尽快开火。不是这样的,嗯,至少不是一直这样。
在 chromium 和 node there used to be a 1ms minimum timeout, apparently it's in the process of being removed in chromium (https://crbug.com/402694) 中,但我相信即使是最新的 nodejs 也仍然有它。
无延迟挂钩事件循环的更好方法是使用 setImmediate
方法,您会看到整个循环大约需要 20 毫秒。