From 3bc16f917d9f3416815c941cae04790020be469e Mon Sep 17 00:00:00 2001 From: Brian White Date: Sun, 25 Aug 2019 04:21:33 -0400 Subject: [PATCH] events: improve once() performance PR-URL: https://github.com/nodejs/node/pull/29307 Reviewed-By: Ben Noordhuis Reviewed-By: Luigi Pinca Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Trivikram Kamat Reviewed-By: Yongsheng Zhang --- benchmark/events/ee-once.js | 52 +++++++++++++++++++++++++++++++------ lib/events.js | 6 +++-- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/benchmark/events/ee-once.js b/benchmark/events/ee-once.js index e1a09fb4b71167..bd0a39565332b2 100644 --- a/benchmark/events/ee-once.js +++ b/benchmark/events/ee-once.js @@ -2,18 +2,54 @@ const common = require('../common.js'); const EventEmitter = require('events').EventEmitter; -const bench = common.createBenchmark(main, { n: [2e7] }); +const bench = common.createBenchmark(main, { + n: [2e7], + argc: [0, 1, 4, 5] +}); -function main({ n }) { +function main({ n, argc }) { const ee = new EventEmitter(); function listener() {} - bench.start(); - for (var i = 0; i < n; i += 1) { - const dummy = (i % 2 === 0) ? 'dummy0' : 'dummy1'; - ee.once(dummy, listener); - ee.emit(dummy); + switch (argc) { + case 0: + bench.start(); + for (let i = 0; i < n; i += 1) { + const dummy = (i % 2 === 0) ? 'dummy0' : 'dummy1'; + ee.once(dummy, listener); + ee.emit(dummy); + } + bench.end(n); + break; + case 1: + bench.start(); + for (let i = 0; i < n; i += 1) { + const dummy = (i % 2 === 0) ? 'dummy0' : 'dummy1'; + ee.once(dummy, listener); + ee.emit(dummy, n); + } + bench.end(n); + break; + case 4: + bench.start(); + for (let i = 0; i < n; i += 1) { + const dummy = (i % 2 === 0) ? 'dummy0' : 'dummy1'; + ee.once(dummy, listener); + ee.emit(dummy, 'foo', argc, 'bar', false); + } + bench.end(n); + break; + case 5: + bench.start(); + for (let i = 0; i < n; i += 1) { + const dummy = (i % 2 === 0) ? 'dummy0' : 'dummy1'; + ee.once(dummy, listener); + ee.emit(dummy, true, 7.5, 'foo', null, n); + } + bench.end(n); + break; + default: + throw new Error('Unsupported argument count'); } - bench.end(n); } diff --git a/lib/events.js b/lib/events.js index ae847dc2341032..ebde85c6ddf990 100644 --- a/lib/events.js +++ b/lib/events.js @@ -290,11 +290,13 @@ EventEmitter.prototype.prependListener = return _addListener(this, type, listener, true); }; -function onceWrapper(...args) { +function onceWrapper() { if (!this.fired) { this.target.removeListener(this.type, this.wrapFn); this.fired = true; - return Reflect.apply(this.listener, this.target, args); + if (arguments.length === 0) + return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); } }