async_hooks: fast-path for PromiseHooks in JS
This is an attempt to eliminate the GC-tracking of promises needed to emit destroy events to async_hooks if there is nothing listening to those events. I've replicated the PromiseHook
handler and PromiseWrap
behaviour in JS to allow a fast-path for handling promise-related events when there is no destroy hook present and therefore no need for expensive gc-tracking. This should significantly improve the performance of async_hooks in promise-heavy applications for the typical/suggested case of context management with AsyncLocalStorage
.
With this comes a few important changes to consider:
- Promises will no longer emit trace events unless there is a destroy hook
- The resource for a promise event will no longer have the
isChainedPromise
property (Though there are ideas of how this could be restored, if there are objections)