Skip to content

Instantly share code, notes, and snippets.

@milahu
Last active Dec 18, 2020
Embed
What would you like to do?
unswitch for loop #jsbench #jsperf (https://jsbench.github.io/#ad362c5589fab6e17498939f5343310d) #jsbench #jsperf
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>unswitch for loop #jsbench #jsperf</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/benchmark/1.0.0/benchmark.min.js"></script>
<script src="./suite.js"></script>
</head>
<body>
<h1>Open the console to view the results</h1>
<h2><code>cmd + alt + j</code> or <code>ctrl + alt + j</code></h2>
</body>
</html>
"use strict";
(function (factory) {
if (typeof Benchmark !== "undefined") {
factory(Benchmark);
} else {
factory(require("benchmark"));
}
})(function (Benchmark) {
var suite = new Benchmark.Suite;
Benchmark.prototype.setup = function () {
const N = 500000; // N must be laaaarge
const a = Array(N);
const min = 10;
const max = 1234;
function make_arrays(N, min, max) {
const a = Array(N);
if (min == max) {
for (let i = 0; i < N; i++) {
if (Math.random() < 0.5) {
a[i] = NaN;
} else {
a[i] = min;
}
}
} else {
for (let i = 0; i < N; i++) a[i] = min + Math.random() * (max - min);
}
return [
a,
a.slice() // copy
];
}
const arr_range = make_arrays(N, min, max);
const arr_minzero = make_arrays(N, 0, max);
const arr_minequal = make_arrays(N, max, max);
function else_branch_old(arr) {
var i;
var l = arr.length;
var offset = 0;
var dim = 1;
var range = max - min
for (i = offset; i < l; i+=dim) {
if (!isNaN(arr[i])) {
arr[i] = range === 0 ? .5 : (arr[i] - min) / range
}
}
}
function else_branch_new(arr) {
var i;
var l = arr.length;
var offset = 0;
var dim = 1;
if (min == max) {
for (i = offset; i < l; i+=dim) {
if (!isNaN(arr[i])) {
arr[i] = .5
}
}
}
else if (min == 0) {
for (i = offset; i < l; i+=dim) {
arr[i] = arr[i] / max
}
}
else {
var range = max - min
for (i = offset; i < l; i+=dim) {
arr[i] = (arr[i] - min) / range
}
}
}
};
suite.add("else_branch_old(arr_range[0]);", function () {
else_branch_old(arr_range[0]);
});
suite.add("else_branch_new(arr_range[1]);", function () {
else_branch_new(arr_range[1]);
});
suite.add("else_branch_old(arr_minzero[0]);", function () {
else_branch_old(arr_minzero[0]);
});
suite.add("else_branch_old(arr_minzero[1]);", function () {
else_branch_old(arr_minzero[1]);
});
suite.add("else_branch_old(arr_minequal[0]);", function () {
else_branch_old(arr_minequal[0]);
});
suite.add("else_branch_old(arr_minequal[1]);", function () {
else_branch_old(arr_minequal[1]);
});
suite.on("cycle", function (evt) {
console.log(" - " + evt.target);
});
suite.on("complete", function (evt) {
console.log(new Array(30).join("-"));
var results = evt.currentTarget.sort(function (a, b) {
return b.hz - a.hz;
});
results.forEach(function (item) {
console.log((idx + 1) + ". " + item);
});
});
console.log("unswitch for loop #jsbench #jsperf");
console.log(new Array(30).join("-"));
suite.run();
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment