User:Mike Dillon/Scripts/bench.js
Appearance
(Redirected from User:Mike Dillon/bench.js)
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
Documentation for this user script can be added at User:Mike Dillon/Scripts/bench. |
// Requires [[User:Mike Dillon/Scripts/easydom.js]]
/* <pre><nowiki> */
function timeFunction (n, f) {
var start = new Date();
// Execute n iterations of function f()
for (var i = 0; i < n; i++) {
f();
}
return new Date().getTime() - start.getTime();
}
function compareFunctions (n, funcs) {
var fns = new Array();
var times = {};
// Go through the function hash and time each one for n iterations
for (var fn in funcs) {
var f = funcs[fn];
var t = timeFunction(n, f);
fns[fns.length] = fn;
times[fn] = t;
}
// Sort the function label list by execution time descending
fns.sort(function (a, b) { return times[b] - times[a]; });
// Start the table that will be returned
var table = easydom.table({ "class": "wikitable" });
// Build the header row
var header = easydom.tr(
easydom.th(),
easydom.th("Count"),
easydom.th("Time"),
easydom.th("Rate")
);
for (var i in fns) {
header.appendChild(easydom.th(fns[i]));
}
table.appendChild(header);
// Build the data rows for each function using fns for order
for (var i in fns) {
var fn = fns[i];
var ft = times[fn];
// Begin row with function label, count, time, and rate
var row = easydom.tr(
easydom.th(fn),
easydom.td(n),
easydom.td(times[fn] + " ms"),
easydom.td(Math.round(n / (times[fn] / 1000)) + "/s")
);
// Fill in comparisons with other functions
for (var j in fns) {
var fn2 = fns[j];
var cmp;
if (fn == fn2) {
cmp = "--";
} else {
// Calculate percentage difference relative to column rate
var ft2 = times[fn2];
var diff = (ft2 - ft) / ft2;
cmp = (diff > 0 ? "+" : "");
cmp += Math.round(1000 * diff) / 10;
cmp += "%";
}
row.appendChild(easydom.td(cmp));
}
// Add the data row to the table
table.appendChild(row);
}
// Return the table's DOM node
return table;
}
/* </nowiki></pre> */