Skip to content

Instantly share code, notes, and snippets.

@cvializ
Last active April 5, 2018 19:13
Show Gist options
  • Save cvializ/1f0f0ac3a7c49d483a1009d3473788fe to your computer and use it in GitHub Desktop.
Save cvializ/1f0f0ac3a7c49d483a1009d3473788fe to your computer and use it in GitHub Desktop.
Mapping over collections of elements (http://jsbench.github.io/#1f0f0ac3a7c49d483a1009d3473788fe) #jsbench #jsperf
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Mapping over collections of elements</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 () {
function sliceMap(iterable, cb) {
return Array.prototype.slice.call(iterable).map(cb);
}
function iterateCursor(iterable, cb) {
for (let i = 0, value; (value = iterable[i]) !== undefined; i++) {
cb(value, i);
}
}
function mapCursor(iterable, cb, opt_size) {
const array = new Array(opt_size || 100);
for (let i = 0, value; (value = iterable[i]) !== undefined; i++) {
array[i] = cb(value, i);
}
array.length = iterable.length;
return array;
}
function identity(x) { return x; }
function noop(x) {}
const fn = identity;
const container = document.createElement('div');
container.classList.add('cv-test-container');
for (let i = 0; i < 500; i++) {
container.appendChild(document.createElement('div'));
container.appendChild(document.createElement('form'));
}
document.body.appendChild(container);
};
Benchmark.prototype.teardown = function () {
document.querySelector('.cv-test-container').remove();
};
suite.add("Array.prototype.slice", function () {
/** Array.prototype.slice */
const elements = document.querySelectorAll('form');
const array = sliceMap(elements, fn);
});
suite.add("iterateCursor with Array", function () {
/** iterateCursor with Array */
const elements = document.querySelectorAll('form');
const array = [];
iterateCursor(elements, (element, i) => {
array[i] = fn(element);
});
});
suite.add("mapCursor", function () {
/** mapCursor */
const elements = document.querySelectorAll('form');
const array = mapCursor(elements, fn);
});
suite.add("\"optimized\" mapCursor", function () {
/** "optimized" mapCursor */
const elements = document.querySelectorAll('form');
const array = mapCursor(elements, fn, 500);
});
suite.add("naive standard form", function () {
/** naive standard form */
var elements = document.querySelectorAll('form');
const array = [];
for (var i = 0; elements[i] != undefined; i++) {
array[i] = fn(elements[i]);
}
});
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("Mapping over collections of elements");
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