Eventing vs Punching

Benchmark created by Guy Bedford on


Description

Comparing having an event array for firing events, as opposed to just chaining a single function and using that.

Setup

/* eventing */
    window.events = [];
    window.addEvent = function(fn) {
      events.push(fn);
    }
    window.fireEvents = function() {
      for (var i = 0; i < events.length; i++)
        events[i].apply(null, arguments);
    }
    
    /* punching */
    Function.chain = function(fn1, fn2) {
      return function() {
        var output = fn1.apply(this, arguments);
        return fn2.apply(this, arguments) || output;
      }
    }
    Function.punch = function(obj, p, fn) {
      obj[p] = Function.chain(obj[p], fn);
    }
    
    /* event punching */
    Function.on = function(obj, p, fn) {
      if (obj[p].__ == undefined) {
        var _super = obj[p];
        obj[p] = function() {
          for (var i = 0; i < obj[p].__.length; i++) {
            obj[p].__[i].apply(this, arguments);
          }
          return output;
        }
        obj[p].__ = [_super];
      }
      
      obj[p].__.push(fn);
    }

Teardown


    delete window.events;
    delete window.punch;
    
    window.events = [];
    window.punch = function() {};
  

Test runner

Ready to run.

Testing in
TestOps/sec
Eventing
for (var i = 0; i < 10; i++)
  addEvent(function() {
    return 123123 / 234;
  });

fireEvents();
ready
Punching method
for (var i = 0; i < 10; i++)
  Function.punch(window, 'punch', function() {
    return 123123 / 234;
  });

window.punch();
 
ready
Eventing / Punching hybrid
for (var i = 0; i < 10; i++) {
  Function.on(window, 'punch', function() {
    return 123123 / 234;
  });
}

window.punch();
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.

  • Revision 1: published by Guy Bedford on