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
Test loop unrolling techniques, such as Duff's Device implemented in JavaScript for a function to find the max value of an array.
<script>
var data = (function() {
var arr = [],
i;
for (i = 0; i < 10000; i += 1) {
arr.push(Math.random());
}
return arr;
}());
var duffForEach = function(arr, f) {
var len = arr.length,
pos = 0;
while (pos < len) {
switch (pos % 10) {
case 0:
f(arr[pos]);
pos++;
case 9:
f(arr[pos]);
pos++;
case 8:
f(arr[pos]);
pos++;
case 7:
f(arr[pos]);
pos++;
case 6:
f(arr[pos]);
pos++;
case 5:
f(arr[pos]);
pos++;
case 4:
f(arr[pos]);
pos++;
case 3:
f(arr[pos]);
pos++;
case 2:
f(arr[pos]);
pos++;
case 1:
f(arr[pos]);
pos++;
}
}
};
var $duff = function (init, f, its) {
its = its || 10;
var ret = "$duff.out = function (arr) {"
+ "var len = arr.length,"
+ "pos = 0;"
+ init.toString()
+ "switch (len % " + its + ") {",
i;
f = f.toString();
f = f.replace(/(param)/g, "arr[pos++]");
for (i = (its -1); i > 0; i -= 1) {
ret += "case " + i + ": " + f + ";";
}
ret += "case 0: } while (pos < len) { ";
for (i = 0; i < its; i += 1) {
ret += f + ";";
}
ret += "}};";
eval(ret);
return $duff.out;
};
var composed = $duff("var max = 0;", "if (param > max) { max = param; }");
</script>
Ready to run.
Test | Ops/sec | |
---|---|---|
Rolled |
| ready |
Unrolled |
| ready |
Duff-style |
| ready |
Duff-style + Eval |
| ready |
You can edit these tests or add more tests to this page by appending /edit to the URL.