Skip to content

Commit f61cc15

Browse files
committed
events: stricter prop & variable checks for perf
Replace truthy/falsey checks of _events and _events[type] with comparisons to undefined for better performance: events/ee-add-remove.js n=250000 5.30 % *** 4.260028e-07 events/ee-emit.js n=2000000 4.18 % *** 1.026649e-05 This has a knock-on effect on modules that use lots of events, e.g.: http2/headers.js nheaders=0 n=1000 2.60 % *** 0.000298338 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 6d4c685 commit f61cc15

File tree

1 file changed

+21
-20
lines changed

1 file changed

+21
-20
lines changed

lib/events.js

+21-20
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ EventEmitter.init = function() {
7878
}
7979
}
8080

81-
if (!this._events || this._events === Object.getPrototypeOf(this)._events) {
81+
if (this._events === undefined ||
82+
this._events === Object.getPrototypeOf(this)._events) {
8283
this._events = Object.create(null);
8384
this._eventsCount = 0;
8485
}
@@ -170,8 +171,8 @@ EventEmitter.prototype.emit = function emit(type) {
170171
var doError = (type === 'error');
171172

172173
events = this._events;
173-
if (events)
174-
doError = (doError && events.error == null);
174+
if (events !== undefined)
175+
doError = (doError && events.error === undefined);
175176
else if (!doError)
176177
return false;
177178

@@ -181,7 +182,7 @@ EventEmitter.prototype.emit = function emit(type) {
181182
if (doError) {
182183
if (arguments.length > 1)
183184
er = arguments[1];
184-
if (domain) {
185+
if (domain !== null && domain !== undefined) {
185186
if (!er) {
186187
const errors = lazyErrors();
187188
er = new errors.Error('ERR_UNHANDLED_ERROR');
@@ -206,10 +207,10 @@ EventEmitter.prototype.emit = function emit(type) {
206207

207208
handler = events[type];
208209

209-
if (!handler)
210+
if (handler === undefined)
210211
return false;
211212

212-
if (domain && this !== process) {
213+
if (domain !== null && domain !== undefined && this !== process) {
213214
domain.enter();
214215
needDomainExit = true;
215216
}
@@ -255,13 +256,13 @@ function _addListener(target, type, listener, prepend) {
255256
}
256257

257258
events = target._events;
258-
if (!events) {
259+
if (events === undefined) {
259260
events = target._events = Object.create(null);
260261
target._eventsCount = 0;
261262
} else {
262263
// To avoid recursion in the case that type === "newListener"! Before
263264
// adding it to the listeners, first emit "newListener".
264-
if (events.newListener) {
265+
if (events.newListener !== undefined) {
265266
target.emit('newListener', type,
266267
listener.listener ? listener.listener : listener);
267268

@@ -272,7 +273,7 @@ function _addListener(target, type, listener, prepend) {
272273
existing = events[type];
273274
}
274275

275-
if (!existing) {
276+
if (existing === undefined) {
276277
// Optimize the case of one listener. Don't need the extra array object.
277278
existing = events[type] = listener;
278279
++target._eventsCount;
@@ -384,11 +385,11 @@ EventEmitter.prototype.removeListener =
384385
}
385386

386387
events = this._events;
387-
if (!events)
388+
if (events === undefined)
388389
return this;
389390

390391
list = events[type];
391-
if (!list)
392+
if (list === undefined)
392393
return this;
393394

394395
if (list === listener || list.listener === listener) {
@@ -424,7 +425,7 @@ EventEmitter.prototype.removeListener =
424425
if (list.length === 1)
425426
events[type] = list[0];
426427

427-
if (events.removeListener)
428+
if (events.removeListener !== undefined)
428429
this.emit('removeListener', type, originalListener || listener);
429430
}
430431

@@ -436,15 +437,15 @@ EventEmitter.prototype.removeAllListeners =
436437
var listeners, events, i;
437438

438439
events = this._events;
439-
if (!events)
440+
if (events === undefined)
440441
return this;
441442

442443
// not listening for removeListener, no need to emit
443-
if (!events.removeListener) {
444+
if (events.removeListener === undefined) {
444445
if (arguments.length === 0) {
445446
this._events = Object.create(null);
446447
this._eventsCount = 0;
447-
} else if (events[type]) {
448+
} else if (events[type] !== undefined) {
448449
if (--this._eventsCount === 0)
449450
this._events = Object.create(null);
450451
else
@@ -472,7 +473,7 @@ EventEmitter.prototype.removeAllListeners =
472473

473474
if (typeof listeners === 'function') {
474475
this.removeListener(type, listeners);
475-
} else if (listeners) {
476+
} else if (listeners !== undefined) {
476477
// LIFO order
477478
for (i = listeners.length - 1; i >= 0; i--) {
478479
this.removeListener(type, listeners[i]);
@@ -487,11 +488,11 @@ EventEmitter.prototype.listeners = function listeners(type) {
487488
var ret;
488489
var events = this._events;
489490

490-
if (!events)
491+
if (events === undefined)
491492
ret = [];
492493
else {
493494
evlistener = events[type];
494-
if (!evlistener)
495+
if (evlistener === undefined)
495496
ret = [];
496497
else if (typeof evlistener === 'function')
497498
ret = [evlistener.listener || evlistener];
@@ -514,12 +515,12 @@ EventEmitter.prototype.listenerCount = listenerCount;
514515
function listenerCount(type) {
515516
const events = this._events;
516517

517-
if (events) {
518+
if (events !== undefined) {
518519
const evlistener = events[type];
519520

520521
if (typeof evlistener === 'function') {
521522
return 1;
522-
} else if (evlistener) {
523+
} else if (evlistener !== undefined) {
523524
return evlistener.length;
524525
}
525526
}

0 commit comments

Comments
 (0)