Native bind vs jQuery.proxy vs Underscore bind

JavaScript performance comparison

Revision 67 of this test case created

Preparation code

<script type="text/javascript">
  // Save native bind
  __nativeBind = Function.prototype.bind;
</script>

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js">
</script>

<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.3.3/underscore-min.js">
</script>

<script src="//ajax.googleapis.com/ajax/libs/mootools/1.5.0/mootools-yui-compressed.js"></script>
<script type="text/javascript">
  MooToolsBind = Function.prototype.bind;

  // Reset bind
  Function.prototype.bind = __nativeBind;
</script>

<script src="//d14ac9rbwzfcvh.cloudfront.net/javascriptsdk/evo-2/evo.min.js"></script>

<script type="text/javascript">
  MDNBind = function(fToBind, oThis) {
    if (typeof fToBind !== "function") {
      // closest thing possible to the ECMAScript 5 internal IsCallable function
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }

    var aArgs = Array.prototype.slice.call(arguments, 1),
      fNOP = function() {},
      fBound = function() {
        return fToBind.apply(oThis,
          aArgs.concat(Array.prototype.slice.call(arguments)));
      };

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();

    return fBound;
  };
</script>

<script type="text/javascript">
  // https://github.com/jonathantneal/polyfill
  // Function.prototype.bind
  PFBind = function bind(scope) {
    var
    callback = this,
      prepend = Array.prototype.slice.call(arguments, 1),
      Constructor = function() {},
      bound = function() {
        return callback.apply(
          this instanceof Constructor && scope ? this : scope,
          prepend.concat(Array.prototype.slice.call(arguments, 0))
        );
      };

    Constructor.prototype = bound.prototype = callback.prototype;

    return bound;
  };
</script>

<script type="text/javascript">
  // Reset bind
  Function.prototype.bind = __nativeBind;
</script>
<script>
Benchmark.prototype.teardown = function() {
    // Reset bind
    Function.prototype.bind = __nativeBind;
   
};
</script>

Preparation code output

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
Native bind
var foo = (function(x) {
  return this + x;
}).bind(1);
foo(1);
pending…
jQuery.proxy
var foo = jQuery.proxy(function(x) {
  return this + x;
}, 1);
foo(1);
pending…
Underscore.js bind
var foo = _.bind(function(x) {
  return this + x;
}, 1);
foo(1)
pending…
Without bind
var bar = function(x) {
  return this + x;
};
var foo = function(x) {
  bar.call(1, x);
}
foo(1);
pending…
MooTools bind
var foo = MooToolsBind.call(function(x) {
  return this + x;
}, 1);
foo(1)
pending…
Evo Ygloo
var foo = _$Y.gloo(function(x) {
  return this + x;
}, 1);
foo(1)
pending…
Evo Bind
var foo = _$Y.bind(function(x) {
  return this + x;
}, 1);
foo(1)
pending…
MDN shim
var foo = MDNBind(function(x) {
  return this + x;
}, 1);
foo(1)
pending…
polyfill bind
var foo = PFBind.apply(function(x) {
  return this + x;
}, [1]);
foo(1)
pending…

Compare results of other browsers

Revisions

You can edit these tests or add even more tests to this page by appending /edit to the URL. Here’s a list of current revisions for this page:

0 comments

Add a comment