User:Mike Dillon/Scripts/bench.js

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// 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> */