// 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> */