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; }

/* */