Pub/Sub implementations (v15)

Revision 15 of this benchmark created by Aksel on


Description

Fixed test case for Peter Higgins pubsub implementation. Previous tests weren't actually unsubbing properly causing slow performance.

Preparation HTML

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
  /*    
  
        jQuery pub/sub plugin by Peter Higgins (dante@dojotoolkit.org)
  
        Loosely based on Dojo publish/subscribe API, limited in scope. Rewritten blindly.
  
        Original is (c) Dojo Foundation 2004-2010. Released under either AFL or new BSD, see:
        http://dojofoundation.org/license for more information.
  
  */
  (function($) {
   var topics = {};
  
   $.publish1 = function(topic, args) {
    if (topics[topic]) {
     var currentTopic = topics[topic],
args = args || {};
  
     for (var i = 0, j = currentTopic.length; i < j; i++) {
      currentTopic[i].call($, args);
     }
    }
   };
  
   $.subscribe1 = function(topic, callback) {
    if (!topics[topic]) {
     topics[topic] = [];
    }
  
    topics[topic].push(callback);
  
    return {
     "topic": topic,
     "callback": callback
    };
   };
  
   $.unsubscribe1 = function(handle) {
    var topic = handle.topic;
  
    if (topics[topic]) {
     var currentTopic = topics[topic];
  
     for (var i = 0, j = currentTopic.length; i < j; i++) {
      if (currentTopic[i] === handle.callback) {
       currentTopic.splice(i, 1);
      }
     }
    }
   };
  
  })(jQuery);
  
  /*!
   * jQuery Tiny Pub/Sub - v0.3pre - 11/4/2010
   * http://benalman.com/
   * 
   * Copyright (c) 2010 "Cowboy" Ben Alman
   * Dual licensed under the MIT and GPL licenses.
   * http://benalman.com/about/license/
   */
  /*!
   * jQuery Tiny Pub/Sub - v0.X - 11/18/2010
   * http://benalman.com/
   * 
   * Original Copyright (c) 2010 "Cowboy" Ben Alman
   * Dual licensed under the MIT and GPL licenses.
   * http://benalman.com/about/license/
   *
   * Made awesome by Rick Waldron
   *
   */
  (function(jQuery) {
   var o = jQuery({});
   jQuery.each({
    "subscribe2": "bind",
    "unsubscribe2": "unbind",
    "publish2": "trigger"
   }, function(fn, api) {
    jQuery[fn] = function() {
     o[api].apply(o, arguments);
    };
   });
  })(jQuery);

  (function(jQuery) {
   var o = jQuery(document);
   jQuery.each({
    "subscribe25": "bind",
    "unsubscribe25": "unbind",
    "publish25": "trigger"
   }, function(fn, api) {
    jQuery[fn] = function() {
     o[api].apply(o, arguments);
    };
   });
  })(jQuery);

  
  
  /*
   * Simple Pub/Sub Implementation for jQuery
   *
   * Inspired by work from Peter Higgins (https://github.com/phiggins42/bloody-jquery-plugins/blob/master/pubsub.js)
   *
   * This is about the simplest way to write a pubsub JavaScript implementation for use with jQuery.
   */
  
  (function($) {
   // Cache of all topics
   var topics = {};
  
   // Iterates through all subscribers of a topic and invokes their callback,
   // passing optional arguments.
   $.publish3 = function(topic, args) {
    if (topics[topic]) {
     var thisTopic = topics[topic],
         thisArgs = args || [];
  
     for (var i = 0, j = thisTopic.length; i < j; i++) {
      thisTopic[i].apply($, thisArgs);
     }
    }
   };
  
   // Returns a handle needed for unsubscribing
   $.subscribe3 = function(topic, callback) {
    if (!topics[topic]) {
     topics[topic] = [];
    }
  
    topics[topic].push(callback);
  
    return {
     topic: topic,
     callback: callback
    };
   };
  
   // Removes the subscriber from the particular topic its handle was assigned to
   $.unsubscribe3 = function(handle) {
    var topic = handle.topic;
  
    if (topics[topic]) {
     var thisTopic = topics[topic];
  
     for (var i = 0, j = thisTopic.length; i < j; i++) {
      if (thisTopic[i] === handle.callback) {
       thisTopic.splice(i, 1);
       // break; here? duplicate handles are possible
      }
     }
    }
   };
  
  })(jQuery);
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
Object cache
var handle = $.subscribe1('foo', function() {
 1 + 1;
});

$.publish1('foo', ['bar']);

$.unsubscribe1(handle);
ready
jQuery object element
$.subscribe2('foo', function() {
 1 + 1;
});

$.publish2('foo', ['bar']);

$.unsubscribe2('foo');
ready
higgins inspired
var handle = $.subscribe3('foo', function(msg) {
 1 + 1;
});

$.publish3('foo', ['bar']);

$.unsubscribe3(handle);
ready
jQuery document element
$.subscribe25('foo', function() {
 1 + 1;
});

$.publish25('foo', ['bar']);

$.unsubscribe25('foo');
ready

Revisions

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