为什么 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 毫秒。

Try it online!