From f8bdb64672f1a940bce594151cc9b845ce3f1903 Mon Sep 17 00:00:00 2001 From: Anatoli Papirovski Date: Mon, 22 Apr 2019 12:09:56 -0700 Subject: [PATCH] lib: remove Reflect.apply where appropriate Using Reflect.apply where the callback context does not need to change is unnecessary and less performant. --- benchmark/timers/timers-breadth-args.js | 42 +++++++++++++++++++++++++ lib/fs.js | 6 ++-- lib/internal/async_hooks.js | 6 ++-- lib/internal/process/task_queues.js | 4 +-- lib/internal/timers.js | 6 ++-- 5 files changed, 52 insertions(+), 12 deletions(-) create mode 100644 benchmark/timers/timers-breadth-args.js diff --git a/benchmark/timers/timers-breadth-args.js b/benchmark/timers/timers-breadth-args.js new file mode 100644 index 00000000000000..5f91603caa0a5c --- /dev/null +++ b/benchmark/timers/timers-breadth-args.js @@ -0,0 +1,42 @@ +'use strict'; +const common = require('../common.js'); + +const bench = common.createBenchmark(main, { + n: [1e6], +}); + +function main({ n }) { + var j = 0; + function cb1(arg1) { + j++; + if (j === n) + bench.end(n); + } + function cb2(arg1, arg2) { + j++; + if (j === n) + bench.end(n); + } + function cb3(arg1, arg2, arg3) { + j++; + if (j === n) + bench.end(n); + } + function cb4(arg1, arg2, arg3, arg4) { + j++; + if (j === n) + bench.end(n); + } + + bench.start(); + for (var i = 0; i < n; i++) { + if (i % 4 === 0) + setTimeout(cb4, 1, 3.14, 1024, true, false); + else if (i % 3 === 0) + setTimeout(cb3, 1, 512, true, null); + else if (i % 2 === 0) + setTimeout(cb2, 1, false, 5.1); + else + setTimeout(cb1, 1, 0); + } +} diff --git a/lib/fs.js b/lib/fs.js index 38c13613cb352a..180fb6abd59f90 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -24,7 +24,7 @@ 'use strict'; -const { Math, Object, Reflect } = primordials; +const { Math, Object } = primordials; const { fs: constants } = internalBinding('constants'); const { @@ -149,9 +149,7 @@ function makeCallback(cb) { throw new ERR_INVALID_CALLBACK(cb); } - return (...args) => { - return Reflect.apply(cb, undefined, args); - }; + return (...args) => cb(...args); } // Special case of `makeCallback()` that is specific to async `*stat()` calls as diff --git a/lib/internal/async_hooks.js b/lib/internal/async_hooks.js index cba8d15a6cb06a..64f5cb2462f6ba 100644 --- a/lib/internal/async_hooks.js +++ b/lib/internal/async_hooks.js @@ -1,6 +1,6 @@ 'use strict'; -const { FunctionPrototype, Object, Reflect } = primordials; +const { FunctionPrototype, Object } = primordials; const { ERR_ASYNC_TYPE, @@ -278,14 +278,14 @@ function clearDefaultTriggerAsyncId() { function defaultTriggerAsyncIdScope(triggerAsyncId, block, ...args) { if (triggerAsyncId === undefined) - return Reflect.apply(block, null, args); + return block(...args); // CHECK(Number.isSafeInteger(triggerAsyncId)) // CHECK(triggerAsyncId > 0) const oldDefaultTriggerAsyncId = async_id_fields[kDefaultTriggerAsyncId]; async_id_fields[kDefaultTriggerAsyncId] = triggerAsyncId; try { - return Reflect.apply(block, null, args); + return block(...args); } finally { async_id_fields[kDefaultTriggerAsyncId] = oldDefaultTriggerAsyncId; } diff --git a/lib/internal/process/task_queues.js b/lib/internal/process/task_queues.js index 12e34b7ff79068..9255dabc4fb8ac 100644 --- a/lib/internal/process/task_queues.js +++ b/lib/internal/process/task_queues.js @@ -1,6 +1,6 @@ 'use strict'; -const { FunctionPrototype, Reflect } = primordials; +const { FunctionPrototype } = primordials; const { // For easy access to the nextTick state in the C++ land, @@ -80,7 +80,7 @@ function processTicksAndRejections() { if (tock.args === undefined) callback(); else - Reflect.apply(callback, undefined, tock.args); + callback(...tock.args); emitAfter(asyncId); } diff --git a/lib/internal/timers.js b/lib/internal/timers.js index 566d7df0365389..8ba7923e57218e 100644 --- a/lib/internal/timers.js +++ b/lib/internal/timers.js @@ -72,7 +72,7 @@ // timers within (or creation of a new list). However, these operations combined // have shown to be trivial in comparison to other timers architectures. -const { Math, Object, Reflect } = primordials; +const { Math, Object } = primordials; const { scheduleTimer, @@ -438,7 +438,7 @@ function getTimerCallbacks(runNextTicks) { if (!argv) immediate._onImmediate(); else - Reflect.apply(immediate._onImmediate, immediate, argv); + immediate._onImmediate(...argv); } finally { immediate._onImmediate = null; @@ -530,7 +530,7 @@ function getTimerCallbacks(runNextTicks) { if (args === undefined) timer._onTimeout(); else - Reflect.apply(timer._onTimeout, timer, args); + timer._onTimeout(...args); } finally { if (timer._repeat && timer._idleTimeout !== -1) { timer._idleTimeout = timer._repeat;