perf(clock): use setImmediate for autoTick macrotask in Node

When called within an I/O cycle, `setImmediate` is generally faster because it
is designed to execute immediately after the current I/O event completes,
whereas `setTimeout(0)` gets placed in the timers queue and might be subject to delays.

> The main advantage to using setImmediate() over setTimeout() is setImmediate()
> will always be executed before any timers if scheduled within an I/O cycle,
> independently of how many timers are present.

* https://nodejs.org/en/learn/asynchronous-work/event-loop-timers-and-nexttick#setimmediate-vs-settimeout
* https://nodejs.org/en/learn/asynchronous-work/event-loop-timers-and-nexttick#poll
* https://nodejs.org/en/learn/asynchronous-work/understanding-setimmediate
This commit is contained in:
Andrew Scott
2025-04-30 13:57:51 -07:00
parent c6b3e947e9
commit 6a7c0e6368
2 changed files with 20 additions and 0 deletions

View File

@@ -222,6 +222,12 @@ callbacks to execute _before_ running the next one.
//
// @return {!Promise<undefined>}
async function newMacrotask() {
if (NODE_JS) {
// setImmediate is generally faster than setTimeout in Node
// https://nodejs.org/en/learn/asynchronous-work/event-loop-timers-and-nexttick#setimmediate-vs-settimeout
return new Promise(resolve => void setImmediate(resolve));
}
// MessageChannel ensures that setTimeout is not throttled to 4ms.
// https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#reasons_for_delays_longer_than_specified
// https://stackblitz.com/edit/stackblitz-starters-qtlpcc