timers: optimize priority queue with adaptive implementation #60189
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
This PR optimizes Node.js timer performance by replacing the binary heap in the internal timer queue with an adaptive priority queue implementation that uses different strategies based on queue size.
Motivation
The current binary heap implementation doesn't take advantage of Node.js's specific timer usage patterns:
TimersListobjects (one per unique timeout duration), not individual timerspeek()is called in tight loops during event loop processing (hot path)shift()andinsert()are comparatively rareImplementation
The adaptive priority queue uses two strategies:
Small queues (n < 10): Unsorted array with cached minimum position
Large queues (n ≥ 10): 4-ary heap
Hysteresis prevents mode switching thrashing:
Performance
Preliminary benchmarks show modest improvements for typical workloads:
Note: Current benchmarks may not fully capture the theoretical improvement due to benchmark overhead. Further investigation ongoing.
Safety
Testing
test/parallel/test-priority-queue-adaptive.js)timers.jscall sitesmake lintpasses (pending CI)Open Questions
Feedback welcome!