Skip to content

Commit 555a7c4

Browse files
committed
events: optimize listener array cloning
This both switches to a single algorithm for array cloning and also speeds up (by ~100% in the ee-listeners-many benchmark) the "many elements" case that was previously handled by `array.slice()`. PR-URL: #1050 Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: Julian Duque <[email protected]>
1 parent 563771d commit 555a7c4

File tree

1 file changed

+6
-13
lines changed

1 file changed

+6
-13
lines changed

lib/events.js

+6-13
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ EventEmitter.prototype.listeners = function listeners(type) {
384384
else if (typeof evlistener === 'function')
385385
ret = [evlistener];
386386
else
387-
ret = arrayClone(evlistener);
387+
ret = arrayClone(evlistener, evlistener.length);
388388
}
389389

390390
return ret;
@@ -413,16 +413,9 @@ function spliceOne(list, index) {
413413
list.pop();
414414
}
415415

416-
function arrayClone(arr, len) {
417-
var ret;
418-
if (len === undefined)
419-
len = arr.length;
420-
if (len >= 50)
421-
ret = arr.slice();
422-
else {
423-
ret = new Array(len);
424-
for (var i = 0; i < len; i += 1)
425-
ret[i] = arr[i];
426-
}
427-
return ret;
416+
function arrayClone(arr, i) {
417+
var copy = new Array(i);
418+
while (i--)
419+
copy[i] = arr[i];
420+
return copy;
428421
}

0 commit comments

Comments
 (0)