Skip to content

Commit a5049c0

Browse files
mscdexBridgeAR
authored andcommitted
events: improve once() performance
PR-URL: #29307 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com> Reviewed-By: Yongsheng Zhang <zyszys98@gmail.com>
1 parent 17d656f commit a5049c0

File tree

2 files changed

+48
-10
lines changed

2 files changed

+48
-10
lines changed

benchmark/events/ee-once.js

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,54 @@
22
const common = require('../common.js');
33
const EventEmitter = require('events').EventEmitter;
44

5-
const bench = common.createBenchmark(main, { n: [2e7] });
5+
const bench = common.createBenchmark(main, {
6+
n: [2e7],
7+
argc: [0, 1, 4, 5]
8+
});
69

7-
function main({ n }) {
10+
function main({ n, argc }) {
811
const ee = new EventEmitter();
912

1013
function listener() {}
1114

12-
bench.start();
13-
for (var i = 0; i < n; i += 1) {
14-
const dummy = (i % 2 === 0) ? 'dummy0' : 'dummy1';
15-
ee.once(dummy, listener);
16-
ee.emit(dummy);
15+
switch (argc) {
16+
case 0:
17+
bench.start();
18+
for (let i = 0; i < n; i += 1) {
19+
const dummy = (i % 2 === 0) ? 'dummy0' : 'dummy1';
20+
ee.once(dummy, listener);
21+
ee.emit(dummy);
22+
}
23+
bench.end(n);
24+
break;
25+
case 1:
26+
bench.start();
27+
for (let i = 0; i < n; i += 1) {
28+
const dummy = (i % 2 === 0) ? 'dummy0' : 'dummy1';
29+
ee.once(dummy, listener);
30+
ee.emit(dummy, n);
31+
}
32+
bench.end(n);
33+
break;
34+
case 4:
35+
bench.start();
36+
for (let i = 0; i < n; i += 1) {
37+
const dummy = (i % 2 === 0) ? 'dummy0' : 'dummy1';
38+
ee.once(dummy, listener);
39+
ee.emit(dummy, 'foo', argc, 'bar', false);
40+
}
41+
bench.end(n);
42+
break;
43+
case 5:
44+
bench.start();
45+
for (let i = 0; i < n; i += 1) {
46+
const dummy = (i % 2 === 0) ? 'dummy0' : 'dummy1';
47+
ee.once(dummy, listener);
48+
ee.emit(dummy, true, 7.5, 'foo', null, n);
49+
}
50+
bench.end(n);
51+
break;
52+
default:
53+
throw new Error('Unsupported argument count');
1754
}
18-
bench.end(n);
1955
}

lib/events.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,11 +290,13 @@ EventEmitter.prototype.prependListener =
290290
return _addListener(this, type, listener, true);
291291
};
292292

293-
function onceWrapper(...args) {
293+
function onceWrapper() {
294294
if (!this.fired) {
295295
this.target.removeListener(this.type, this.wrapFn);
296296
this.fired = true;
297-
return Reflect.apply(this.listener, this.target, args);
297+
if (arguments.length === 0)
298+
return this.listener.call(this.target);
299+
return this.listener.apply(this.target, arguments);
298300
}
299301
}
300302

0 commit comments

Comments
 (0)