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: https://github.com/nodejs/node/pull/16212 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Refael Ackermann <refack@gmail.com>
This commit is contained in:
parent
fd166a8759
commit
d5fb78982a
@ -162,23 +162,22 @@ function emitMany(handler, isFn, self, args) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EventEmitter.prototype.emit = function emit(type) {
|
EventEmitter.prototype.emit = function emit(type, ...args) {
|
||||||
var er, handler, len, args, i, events, domain;
|
let doError = (type === 'error');
|
||||||
var needDomainExit = false;
|
|
||||||
var doError = (type === 'error');
|
|
||||||
|
|
||||||
events = this._events;
|
const events = this._events;
|
||||||
if (events !== undefined)
|
if (events !== undefined)
|
||||||
doError = (doError && events.error === undefined);
|
doError = (doError && events.error === undefined);
|
||||||
else if (!doError)
|
else if (!doError)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
domain = this.domain;
|
const domain = this.domain;
|
||||||
|
|
||||||
// If there is no 'error' event listener then throw.
|
// If there is no 'error' event listener then throw.
|
||||||
if (doError) {
|
if (doError) {
|
||||||
if (arguments.length > 1)
|
let er;
|
||||||
er = arguments[1];
|
if (args.length > 0)
|
||||||
|
er = args[0];
|
||||||
if (domain !== null && domain !== undefined) {
|
if (domain !== null && domain !== undefined) {
|
||||||
if (!er) {
|
if (!er) {
|
||||||
const errors = lazyErrors();
|
const errors = lazyErrors();
|
||||||
@ -202,37 +201,32 @@ EventEmitter.prototype.emit = function emit(type) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
handler = events[type];
|
const handler = events[type];
|
||||||
|
|
||||||
if (handler === undefined)
|
if (handler === undefined)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
let needDomainExit = false;
|
||||||
if (domain !== null && domain !== undefined && this !== process) {
|
if (domain !== null && domain !== undefined && this !== process) {
|
||||||
domain.enter();
|
domain.enter();
|
||||||
needDomainExit = true;
|
needDomainExit = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var isFn = typeof handler === 'function';
|
const isFn = typeof handler === 'function';
|
||||||
len = arguments.length;
|
switch (args.length) {
|
||||||
switch (len) {
|
case 0:
|
||||||
// fast cases
|
|
||||||
case 1:
|
|
||||||
emitNone(handler, isFn, this);
|
emitNone(handler, isFn, this);
|
||||||
break;
|
break;
|
||||||
|
case 1:
|
||||||
|
emitOne(handler, isFn, this, args[0]);
|
||||||
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
emitOne(handler, isFn, this, arguments[1]);
|
emitTwo(handler, isFn, this, args[0], args[1]);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
emitTwo(handler, isFn, this, arguments[1], arguments[2]);
|
emitThree(handler, isFn, this, args[0], args[1], args[2]);
|
||||||
break;
|
break;
|
||||||
case 4:
|
|
||||||
emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);
|
|
||||||
break;
|
|
||||||
// slower
|
|
||||||
default:
|
default:
|
||||||
args = new Array(len - 1);
|
|
||||||
for (i = 1; i < len; i++)
|
|
||||||
args[i - 1] = arguments[i];
|
|
||||||
emitMany(handler, isFn, this, args);
|
emitMany(handler, isFn, this, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user