timers: fix performance regression
authorBen Noordhuis <info@bnoordhuis.nl>
Thu, 22 Dec 2011 13:42:20 +0000 (14:42 +0100)
committerBen Noordhuis <info@bnoordhuis.nl>
Thu, 22 Dec 2011 13:42:25 +0000 (14:42 +0100)
Fix a 5-7% performance regression in the http_simple benchmark that was
introduced by the following commits:

  348d8cd timers: remove _idleTimeout from item in .unenroll()
  f2f3028 timers: fix memory leak in setTimeout
  098fef6 timers: remember extra setTimeout() arguments when timeout==0

Fix suggested by Bert Belder.

lib/timers.js

index 35085e0..7a57d34 100644 (file)
@@ -108,8 +108,8 @@ var unenroll = exports.unenroll = function(item) {
     list.close();
     delete lists[item._idleTimeout];
   }
-  //if active is called later, then we want to make sure not to insert again
-  delete item._idleTimeout;
+  // if active is called later, then we want to make sure not to insert again
+  item._idleTimeout = -1;
 };
 
 
@@ -151,17 +151,18 @@ exports.setTimeout = function(callback, after) {
   if (after <= 0) {
     // Use the slow case for after == 0
     timer = new Timer();
+    timer._callback = callback;
 
     if (arguments.length <= 2) {
       timer._onTimeout = function() {
-        callback();
-        timer.close();
+        this._callback();
+        this.close();
       }
     } else {
       var args = Array.prototype.slice.call(arguments, 2);
       timer._onTimeout = function() {
-        callback.apply(timer, args);
-        timer.close();
+        this._callback.apply(timer, args);
+        this.close();
       }
     }