Skip to content
This repository was archived by the owner on Aug 31, 2018. It is now read-only.

Commit 88b62b7

Browse files
apapirovskiaddaleax
authored andcommitted
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: nodejs/node#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>
1 parent 7d29d4a commit 88b62b7

1 file changed

Lines changed: 20 additions & 19 deletions

File tree

lib/extras/events.js

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
7171
EventEmitter.init = function() {
7272
this.domain = null;
7373

74-
if (!this._events || this._events === Object.getPrototypeOf(this)._events) {
74+
if (this._events === undefined ||
75+
this._events === Object.getPrototypeOf(this)._events) {
7576
this._events = Object.create(null);
7677
this._eventsCount = 0;
7778
}
@@ -165,8 +166,8 @@ EventEmitter.prototype.emit = function emit(type) {
165166
var doError = (type === 'error');
166167

167168
events = this._events;
168-
if (events)
169-
doError = (doError && events.error == null);
169+
if (events !== undefined)
170+
doError = (doError && events.error === undefined);
170171
else if (!doError)
171172
return false;
172173

@@ -176,7 +177,7 @@ EventEmitter.prototype.emit = function emit(type) {
176177
if (doError) {
177178
if (arguments.length > 1)
178179
er = arguments[1];
179-
if (domain) {
180+
if (domain !== null && domain !== undefined) {
180181
if (!er) {
181182
er = new Error('Unhandled "error" event');
182183
er.code = 'ERR_UNHANDLED_ERROR';
@@ -202,7 +203,7 @@ EventEmitter.prototype.emit = function emit(type) {
202203

203204
handler = events[type];
204205

205-
if (!handler)
206+
if (handler === undefined)
206207
return false;
207208

208209
if (typeof process !== 'undefined' && domain && this !== process) {
@@ -254,13 +255,13 @@ function _addListener(target, type, listener, prepend) {
254255
}
255256

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

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

274-
if (!existing) {
275+
if (existing === undefined) {
275276
// Optimize the case of one listener. Don't need the extra array object.
276277
existing = events[type] = listener;
277278
++target._eventsCount;
@@ -390,11 +391,11 @@ EventEmitter.prototype.removeListener =
390391
}
391392

392393
events = this._events;
393-
if (!events)
394+
if (events === undefined)
394395
return this;
395396

396397
list = events[type];
397-
if (!list)
398+
if (list === undefined)
398399
return this;
399400

400401
if (list === listener || list.listener === listener) {
@@ -427,7 +428,7 @@ EventEmitter.prototype.removeListener =
427428
if (list.length === 1)
428429
events[type] = list[0];
429430

430-
if (events.removeListener)
431+
if (events.removeListener !== undefined)
431432
this.emit('removeListener', type, originalListener || listener);
432433
}
433434

@@ -439,15 +440,15 @@ EventEmitter.prototype.removeAllListeners =
439440
var listeners, events, i;
440441

441442
events = this._events;
442-
if (!events)
443+
if (events === undefined)
443444
return this;
444445

445446
// not listening for removeListener, no need to emit
446-
if (!events.removeListener) {
447+
if (events.removeListener === undefined) {
447448
if (arguments.length === 0) {
448449
this._events = Object.create(null);
449450
this._eventsCount = 0;
450-
} else if (events[type]) {
451+
} else if (events[type] !== undefined) {
451452
if (--this._eventsCount === 0)
452453
this._events = Object.create(null);
453454
else
@@ -475,7 +476,7 @@ EventEmitter.prototype.removeAllListeners =
475476

476477
if (typeof listeners === 'function') {
477478
this.removeListener(type, listeners);
478-
} else if (listeners) {
479+
} else if (listeners !== undefined) {
479480
// LIFO order
480481
for (i = listeners.length - 1; i >= 0; i--) {
481482
this.removeListener(type, listeners[i]);
@@ -490,11 +491,11 @@ EventEmitter.prototype.listeners = function listeners(type) {
490491
var ret;
491492
var events = this._events;
492493

493-
if (!events)
494+
if (events === undefined)
494495
ret = [];
495496
else {
496497
evlistener = events[type];
497-
if (!evlistener)
498+
if (evlistener === undefined)
498499
ret = [];
499500
else if (typeof evlistener === 'function')
500501
ret = [evlistener.listener || evlistener];
@@ -517,12 +518,12 @@ EventEmitter.prototype.listenerCount = listenerCount;
517518
function listenerCount(type) {
518519
const events = this._events;
519520

520-
if (events) {
521+
if (events !== undefined) {
521522
const evlistener = events[type];
522523

523524
if (typeof evlistener === 'function') {
524525
return 1;
525-
} else if (evlistener) {
526+
} else if (evlistener !== undefined) {
526527
return evlistener.length;
527528
}
528529
}

0 commit comments

Comments
 (0)