From d3d4e10107a594a758baf2cd5e2c1258671e58c5 Mon Sep 17 00:00:00 2001 From: Anatoli Papirovski Date: Sun, 31 Mar 2019 12:41:14 -0700 Subject: [PATCH] async_hooks: improve AsyncResource performance Accessing symbols is generally quite expensive and so is emitInit, only do both when actually required. PR-URL: https://github.com/nodejs/node/pull/27032 Reviewed-By: Gus Caplan Reviewed-By: Ruben Bridgewater Reviewed-By: James M Snell --- lib/async_hooks.js | 25 ++++++++++++++----------- lib/internal/async_hooks.js | 5 +---- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/async_hooks.js b/lib/async_hooks.js index 88b8fd705a0efa..3a12a241ea5d5f 100644 --- a/lib/async_hooks.js +++ b/lib/async_hooks.js @@ -27,6 +27,7 @@ const { emitBefore, emitAfter, emitDestroy, + initHooksExist, } = internal_async_hooks; // Get symbols @@ -146,29 +147,31 @@ class AsyncResource { throw new ERR_INVALID_ASYNC_ID('triggerAsyncId', triggerAsyncId); } - this[async_id_symbol] = newAsyncId(); + const asyncId = newAsyncId(); + this[async_id_symbol] = asyncId; this[trigger_async_id_symbol] = triggerAsyncId; + // This prop name (destroyed) has to be synchronized with C++ - this[destroyedSymbol] = { destroyed: false }; + const destroyed = { destroyed: false }; + this[destroyedSymbol] = destroyed; - emitInit( - this[async_id_symbol], type, this[trigger_async_id_symbol], this - ); + if (initHooksExist()) { + emitInit(asyncId, type, triggerAsyncId, this); + } if (!opts.requireManualDestroy) { - registerDestroyHook(this, this[async_id_symbol], this[destroyedSymbol]); + registerDestroyHook(this, asyncId, destroyed); } } runInAsyncScope(fn, thisArg, ...args) { - emitBefore(this[async_id_symbol], this[trigger_async_id_symbol]); - let ret; + const asyncId = this[async_id_symbol]; + emitBefore(asyncId, this[trigger_async_id_symbol]); try { - ret = Reflect.apply(fn, thisArg, args); + return Reflect.apply(fn, thisArg, args); } finally { - emitAfter(this[async_id_symbol]); + emitAfter(asyncId); } - return ret; } emitDestroy() { diff --git a/lib/internal/async_hooks.js b/lib/internal/async_hooks.js index 676a2bd2c0be44..a1f3c07defe879 100644 --- a/lib/internal/async_hooks.js +++ b/lib/internal/async_hooks.js @@ -286,14 +286,11 @@ function defaultTriggerAsyncIdScope(triggerAsyncId, block, ...args) { const oldDefaultTriggerAsyncId = async_id_fields[kDefaultTriggerAsyncId]; async_id_fields[kDefaultTriggerAsyncId] = triggerAsyncId; - let ret; try { - ret = Reflect.apply(block, null, args); + return Reflect.apply(block, null, args); } finally { async_id_fields[kDefaultTriggerAsyncId] = oldDefaultTriggerAsyncId; } - - return ret; }