events: optimize listener array cloning
authorBrian White <mscdex@mscdex.net>
Thu, 5 Mar 2015 03:21:47 +0000 (22:21 -0500)
committerBrian White <mscdex@mscdex.net>
Thu, 5 Mar 2015 03:21:47 +0000 (22:21 -0500)
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: https://github.com/iojs/io.js/pull/1050
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Julian Duque <julianduquej@gmail.com>
lib/events.js

index 02e7ac9..6bd2a77 100644 (file)
@@ -384,7 +384,7 @@ EventEmitter.prototype.listeners = function listeners(type) {
     else if (typeof evlistener === 'function')
       ret = [evlistener];
     else
-      ret = arrayClone(evlistener);
+      ret = arrayClone(evlistener, evlistener.length);
   }
 
   return ret;
@@ -413,16 +413,9 @@ function spliceOne(list, index) {
   list.pop();
 }
 
-function arrayClone(arr, len) {
-  var ret;
-  if (len === undefined)
-    len = arr.length;
-  if (len >= 50)
-    ret = arr.slice();
-  else {
-    ret = new Array(len);
-    for (var i = 0; i < len; i += 1)
-      ret[i] = arr[i];
-  }
-  return ret;
+function arrayClone(arr, i) {
+  var copy = new Array(i);
+  while (i--)
+    copy[i] = arr[i];
+  return copy;
 }