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 rndFieldName() {
return 'a' + Math.floor(Math.random()*999).toString(16);
}
function createWatch1(last) {
var field = rndFieldName();
var obj = {};
obj[field] = 1;
return (last.next = {
obj: obj,
lastValue: 1,
field: field,
next: null
});
}
function createWatch2(last) {
var field0 = rndFieldName();
var field1 = rndFieldName();
var field2 = rndFieldName();
var field3 = rndFieldName();
var field4 = rndFieldName();
var field5 = rndFieldName();
var field6 = rndFieldName();
var field7 = rndFieldName();
var field8 = rndFieldName();
var field9 = rndFieldName();
var getter0 = new Function('s', 'return s.'+field0);
var getter1 = new Function('s', 'return s.'+field1);
var getter2 = new Function('s', 'return s.'+field2);
var getter3 = new Function('s', 'return s.'+field3);
var getter4 = new Function('s', 'return s.'+field4);
var getter5 = new Function('s', 'return s.'+field5);
var getter6 = new Function('s', 'return s.'+field6);
var getter7 = new Function('s', 'return s.'+field7);
var getter8 = new Function('s', 'return s.'+field8);
var getter9 = new Function('s', 'return s.'+field9);
var obj0 = {};
var obj1 = {};
var obj2 = {};
var obj3 = {};
var obj4 = {};
var obj5 = {};
var obj6 = {};
var obj7 = {};
var obj8 = {};
var obj9 = {};
obj0[field0] = 1;
obj1[field1] = 1;
obj2[field2] = 1;
obj3[field3] = 1;
obj4[field4] = 1;
obj5[field5] = 1;
obj6[field6] = 1;
obj7[field7] = 1;
obj8[field8] = 1;
obj9[field9] = 1;
return (last.next = {
obj0: obj0, lastValue0: 1, field0: field0, getter0:getter0,
obj1: obj1, lastValue1: 1, field1: field1, getter1:getter1,
obj2: obj2, lastValue2: 1, field2: field2, getter2:getter2,
obj3: obj3, lastValue3: 1, field3: field3, getter3:getter3,
obj4: obj4, lastValue4: 1, field4: field4, getter4:getter4,
obj5: obj5, lastValue5: 1, field5: field5, getter5:getter5,
obj6: obj6, lastValue6: 1, field6: field6, getter6:getter6,
obj7: obj7, lastValue7: 1, field7: field7, getter7:getter7,
obj8: obj8, lastValue8: 1, field8: field8, getter8:getter8,
obj9: obj9, lastValue9: 1, field9: field9, getter9:getter9,
next: null
});
}
function createWatch3(last) {
var field = rndFieldName();
var getter = new Function('s', 'return s.'+field);
var obj = {};
obj[field] = 1;
return (last.next = {
obj0: obj, lastValue0: 1, field0: field, getter0:getter,
obj1: obj, lastValue1: 1, field1: field, getter1:getter,
obj2: obj, lastValue2: 1, field2: field, getter2:getter,
obj3: obj, lastValue3: 1, field3: field, getter3:getter,
obj4: obj, lastValue4: 1, field4: field, getter4:getter,
next: null
});
}
var head1 = createWatch1({});
var current = head1;
for(var i = 1; i < 10000; i++) {
current = createWatch1(current);
}
var head2 = createWatch2({});
var current = head2;
for(var i = 1; i < 1000; i++) {
current = createWatch2(current);
}
var head4 = createWatch3({});
var current = head4;
for(var i = 1; i < 2000; i++) {
current = createWatch2(current);
}
///////////////////////////////////////
function Watch1(previous) {
if (previous) previous.next = this;
this.field = rndFieldName();
this.obj = {};
this.lastValue = 1;
this.getter = new Function('c', 'return c.' + this.field);
this.obj[this.field] = this.lastValue;
this.check = Watch1.prototype.check;
}
Watch1.prototype.check = function() {
if (this.obj[this.field] !== this.lastValue) throw "DIRTY";
return this.next;
}
var head3 = new Watch1();
var current = head3;
for(var i = 1; i < 10000; i++) {
current = new Watch1(current);
}
///////////////////////////////////////
var size = 10000;
var objs = new Array(size);
var objFields = new Array(size);
var lastValues = new Array(size);
for(var i = 0; i < size; i++) {
var obj = objs[i] = {};
objFields[i] = 'a' + Math.floor(Math.random()*999).toString(16);
lastValues[i] = obj[objFields[i]] = 1;
}
Ready to run.
Test | Ops/sec | |
---|---|---|
dirtyCheck1 |
| ready |
dirtyCheck2 |
| ready |
dirtyCheck3 |
| ready |
unrolled reflect |
| ready |
function getter |
| ready |
Watch class |
| ready |
Watch Class method |
| ready |
Watch class getter |
| ready |
dirtyCheck1 if |
| ready |
You can edit these tests or add more tests to this page by appending /edit to the URL.