From afd1bf65fdd5da46577425229aa5bd596b0eb56f Mon Sep 17 00:00:00 2001 From: Roberto Bianchi Date: Fri, 6 Nov 2026 11:55:55 +0100 Subject: [PATCH] lib: use indexed appends for dependent signals Avoid a primordial push call for each dependent signal. Signed-off-by: Roberto Bianchi --- .../abort-controller-abort-fanout.js | 31 +++++++++++++++++++ lib/internal/abort_controller.js | 3 +- 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 benchmark/abort_controller/abort-controller-abort-fanout.js diff --git a/benchmark/abort_controller/abort-controller-abort-fanout.js b/benchmark/abort_controller/abort-controller-abort-fanout.js new file mode 100644 index 000000000000..b849f9cd8077 --- /dev/null +++ b/benchmark/abort_controller/abort-controller-abort-fanout.js @@ -0,0 +1,31 @@ +'use strict'; +const common = require('../common.js'); +const assert = require('node:assert'); + +const bench = common.createBenchmark(main, { + n: [1000], + fanout: [0, 1, 16, 64], +}); + +function main({ n, fanout }) { + const reason = new Error('reason'); + const controllers = []; + const signals = []; + + for (let i = 0; i < n; i++) { + const controller = new AbortController(); + controllers[i] = controller; + for (let j = 0; j < fanout; j++) { + signals[signals.length] = AbortSignal.any([controller.signal]); + } + } + + bench.start(); + for (const controller of controllers) { + controller.abort(reason); + } + bench.end(n); + + assert.strictEqual(signals.length, n * fanout); + assert(signals.every((signal) => signal.aborted)); +} diff --git a/lib/internal/abort_controller.js b/lib/internal/abort_controller.js index 7daa63e1f91d..9f524d5cb5e2 100644 --- a/lib/internal/abort_controller.js +++ b/lib/internal/abort_controller.js @@ -4,7 +4,6 @@ // in https://github.com/mysticatea/abort-controller (MIT license) const { - ArrayPrototypePush, FunctionPrototypeCall, ObjectAssign, ObjectDefineProperties, @@ -577,7 +576,7 @@ function abortSignal(signal, reason) { dependentSignal[kReason] = reason; dependentSignal[kAborted] = true; // 2. Append dependentSignal to dependentSignalsToAbort. - ArrayPrototypePush(dependentSignalsToAbort, dependentSignal); + dependentSignalsToAbort[dependentSignalsToAbort.length] = dependentSignal; } }); }