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
<script>
//1
var circleFns = {
area: function() {
return Math.PI * this.radius * this.radius;
},
grow: function() {
this.radius++;
},
shrink: function() {
this.radius--;
}
}
//2
var asCircle = function() {
this.area = function() {
return Math.PI * this.radius * this.radius;
};
this.grow = function() {
this.radius++;
};
this.shrink = function() {
this.radius--;
};
}
//3
var asCircleCached = (function() {
var area = function() {
return Math.PI * this.radius * this.radius;
};
var grow = function() {
this.radius++;
};
var shrink = function() {
this.radius--;
};
return function() {
this.area = area, this.grow = grow, this.shrink = shrink;
}
})();
//4
Function.prototype.curry = function() {
var fn = this;
var args = [].slice.call(arguments, 0);
return function() {
return fn.apply(this, args.concat([].slice.call(arguments, 0)));
}
}
//4
var asCircleCachedAndCurried = (function() {
var area = function() {
return Math.PI * this.radius * this.radius;
};
var grow = function(growBy) {
this.radius += growBy;
};
var shrink = function(shrinkBy) {
this.radius -= shrinkBy;
};
return function(options) {
this.area = area, this.grow = grow.curry(options['growBy']), this.shrink = shrink.curry(options['shrinkBy'])
}
})();
//5
var asCircleWithOptions = function(options) {
this.area = function() {
return Math.PI * this.radius * this.radius;
};
this.grow = function() {
this.radius += options.growBy;
};
this.shrink = function() {
this.radius -= options.shrinkBy;
};
}
//set up test constructor
var CircularObject = function(radius) {
this.radius = radius
};
var strf = "", strf2 = "", strf3="";
var fnsA = [], fnsP = [], fnsN = [];
var fns = circleFns;
var K = 0;
for (var l in fns)
{
var f = fns[l];
fnsA.push(f);
fnsP.push(l);
fnsN.push('fnsA['+ K +']');
strf += "this." + l + " = fnsA[" + K + "]; ";
strf2 += "o." + l + " = " + l+ "; ";
strf3 += "this." + l + " = " + l + "; ";
K++;
}
var Maker = new Function(strf);
var meta = "var Maker2 = new Function('" + fnsP.join("', '") + "', 'o', strf2); ";
meta += "var Maker3 = Maker2.bind(null, " + fnsN.join(", ") + ");";
eval(meta);
var meta2 = [
'var Maker4 = (function(',
fnsP.join(", "),
') { ',
'return function () { ',
strf3,
'};',
'})(',
fnsN.join(", "),
');'
].join(' ');
eval(meta2);
var meta3 = [
'var Maker5 = (function(',
fnsP.join(", "),
') { ',
'return function (o) { ',
strf2,
'};',
'})(',
fnsN.join(", "),
');'
].join(' ');
eval(meta3);
var meta4 = [
'var Maker6 = (function(',
fnsP.join(", "),
') { ',
'return function (options) { ',
"this.area = area, this.grow = grow.bind(this, options['growBy']), this.shrink = shrink.bind(this, options['shrinkBy'])",
'};',
'})(',
fnsN.join(", "),
');'
].join(' ');
eval(meta4);
</script>
Ready to run.
Test | Ops/sec | |
---|---|---|
new style uncached w/options |
| ready |
with Function() |
| ready |
meta |
| ready |
meta2 |
| ready |
meta3 |
| ready |
metacurry |
| ready |
old style |
| ready |
new style |
| ready |
new style w/ caching |
| ready |
new style w/caching and options |
| ready |
You can edit these tests or add more tests to this page by appending /edit to the URL.