User:Mike Dillon/Scripts/bench.js

// Requires User:Mike Dillon/Scripts/easydom.js

/*

 */

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;

}

/*

*/