jsPerf.app is an online JavaScript performance benchmark test runner & jsperf.com mirror. It is a complete rewrite in homage to the once excellent jsperf.com now with hopefully a more modern & maintainable codebase.
jsperf.com URLs are mirrored at the same path, e.g:
https://jsperf.com/negative-modulo/2
Can be accessed at:
https://jsperf.app/negative-modulo/2
function isFunction(value){return typeof value === 'function';}
function bind(self, fn) {
var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];
if (isFunction(fn) && !(fn instanceof RegExp)) {
return curryArgs.length
? function() {
return arguments.length
? fn.apply(self, curryArgs.concat(slice.call(arguments, 0)))
: fn.apply(self, curryArgs);
}
: function() {
return arguments.length
? fn.apply(self, arguments)
: fn.call(self);
};
} else {
// in IE, native methods are not functions so they cannot be bound (note: they don't need to be)
return fn;
}
}
var fnProtoBind = Function.prototype.bind;
function bind2(self, fn) {
var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];
if (isFunction(fn) && !(fn instanceof RegExp)) {
if (fnProtoBind && fn.bind === fnProtoBind) {
curryArgs.unshift(self);
return fnProtoBind.apply(fn, curryArgs);
}
return curryArgs.length
? function() {
return arguments.length
? fn.apply(self, curryArgs.concat(slice.call(arguments, 0)))
: fn.apply(self, curryArgs);
}
: function() {
return arguments.length
? fn.apply(self, arguments)
: fn.call(self);
};
} else {
// in IE, native methods are not functions so they cannot be bound (note: they don't need to be)
return fn;
}
}
function bind3(self, fn) {
var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];
if (isFunction(fn) && !(fn instanceof RegExp)) {
return curryArgs.length
? function() {
return arguments.length
? fn.apply(self, curryArgs.concat(slice.call(arguments, 0)))
: fn.apply(self, curryArgs);
}
: function() {
return fn.apply(self, arguments);
};
} else {
// in IE, native methods are not functions so they cannot be bound (note: they don't need to be)
return fn;
}
}
var func = function() {},
obj = {};
var funcOld = bind(obj, func),
funcNew = bind2(obj, func),
funcTweaked = bind3(obj, func);
Ready to run.
Test | Ops/sec | |
---|---|---|
angular.bind no args |
| ready |
angular.bind with native bind no args |
| ready |
angular.bind 1 arg |
| ready |
angular.bind with native bind 1 arg |
| ready |
tweaked angular.bind no args |
| ready |
tweaked angular.bind 1 arg |
| ready |
angular.bind random args |
| ready |
angular.bind with native bind random args |
| ready |
tweaked angular.bind with random args |
| ready |
You can edit these tests or add more tests to this page by appending /edit to the URL.