Skip to content

Commit d5fb789

Browse files
committed
events: use spread function param in emit
With recent changes in V8, it is now as performant or faster to use spread parameter within EventEmitter.prototype.emit, especially in cases where looping over arguments is required. events/ee-emit.js n=2000000 4.40 % *** 1.505543e-06 events/ee-emit-1-arg.js n=2000000 2.16 % *** 2.434584e-10 events/ee-emit-2-args.js n=2000000 1.05 % ** 0.001764852 events/ee-emit-3-args.js n=2000000 2.18 % *** 3.234954e-08 events/ee-emit-6-args.js n=2000000 17.17 % *** 1.298702e-103 events/ee-emit-10-args.js n=2000000 17.14 % *** 1.144958e-97 This has a knock-on effect for modules that use events extensively, such as http2: http2/headers.js nheaders=0 n=1000 2.10 % *** 6.792106e-11 PR-URL: #16212 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Refael Ackermann <[email protected]>
1 parent fd166a8 commit d5fb789

File tree

1 file changed

+17
-23
lines changed

1 file changed

+17
-23
lines changed

lib/events.js

+17-23
Original file line numberDiff line numberDiff line change
@@ -162,23 +162,22 @@ function emitMany(handler, isFn, self, args) {
162162
}
163163
}
164164

165-
EventEmitter.prototype.emit = function emit(type) {
166-
var er, handler, len, args, i, events, domain;
167-
var needDomainExit = false;
168-
var doError = (type === 'error');
165+
EventEmitter.prototype.emit = function emit(type, ...args) {
166+
let doError = (type === 'error');
169167

170-
events = this._events;
168+
const events = this._events;
171169
if (events !== undefined)
172170
doError = (doError && events.error === undefined);
173171
else if (!doError)
174172
return false;
175173

176-
domain = this.domain;
174+
const domain = this.domain;
177175

178176
// If there is no 'error' event listener then throw.
179177
if (doError) {
180-
if (arguments.length > 1)
181-
er = arguments[1];
178+
let er;
179+
if (args.length > 0)
180+
er = args[0];
182181
if (domain !== null && domain !== undefined) {
183182
if (!er) {
184183
const errors = lazyErrors();
@@ -202,37 +201,32 @@ EventEmitter.prototype.emit = function emit(type) {
202201
return false;
203202
}
204203

205-
handler = events[type];
204+
const handler = events[type];
206205

207206
if (handler === undefined)
208207
return false;
209208

209+
let needDomainExit = false;
210210
if (domain !== null && domain !== undefined && this !== process) {
211211
domain.enter();
212212
needDomainExit = true;
213213
}
214214

215-
var isFn = typeof handler === 'function';
216-
len = arguments.length;
217-
switch (len) {
218-
// fast cases
219-
case 1:
215+
const isFn = typeof handler === 'function';
216+
switch (args.length) {
217+
case 0:
220218
emitNone(handler, isFn, this);
221219
break;
220+
case 1:
221+
emitOne(handler, isFn, this, args[0]);
222+
break;
222223
case 2:
223-
emitOne(handler, isFn, this, arguments[1]);
224+
emitTwo(handler, isFn, this, args[0], args[1]);
224225
break;
225226
case 3:
226-
emitTwo(handler, isFn, this, arguments[1], arguments[2]);
227-
break;
228-
case 4:
229-
emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);
227+
emitThree(handler, isFn, this, args[0], args[1], args[2]);
230228
break;
231-
// slower
232229
default:
233-
args = new Array(len - 1);
234-
for (i = 1; i < len; i++)
235-
args[i - 1] = arguments[i];
236230
emitMany(handler, isFn, this, args);
237231
}
238232

0 commit comments

Comments
 (0)