User:Mike Dillon/Scripts/bench.js

From Wiktionary, the free dictionary
Jump to navigation Jump to search

Note: You may have to bypass your browser’s cache to see the changes. In addition, after saving a sitewide CSS file such as MediaWiki:Common.css, it will take 5-10 minutes before the changes take effect, even if you clear your cache.

  • Mozilla / Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Command-R on a Macintosh);
  • Konqueror and Chrome: click Reload or press F5;
  • Opera: clear the cache in Tools → Preferences;
  • Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5.

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