Frage

Gibt es ein Paket, das ich Benchmark JavaScript-Code hilft? Ich bin nicht auf Firebug und solche Werkzeuge.

Ich brauche 2 verschiedene JavaScript-Funktionen zu vergleichen, die ich umgesetzt haben. Ich bin sehr vertraut mit Perl Benchmark ( Benchmark.pm ) -Modul und ich bin auf der Suche nach etwas ähnliches in JavaScript.

hat sich der Schwerpunkt JavaScript-Code über das Benchmarking über Bord gegangen? Kann ich mit dem Timing nur einen Durchlauf der Funktionen wegkommen?

War es hilfreich?

Lösung

Just Zeit mehr Iterationen der einzelnen Funktionen. Eine Iteration wird wahrscheinlich nicht genug sein, aber (je nachdem, wie komplex Ihre Funktionen sind) irgendwo näher an 100 oder sogar 1.000 Iterationen sollte die Arbeit machen.

Firebug hat auch einen Profiler wenn Sie wollen, um zu sehen, welche Teile Ihrer Funktion verlangsamen es nach unten.

Edit: Um die zukünftigen Leser, die unten Antwort JSPerf Empfehlung sollte die richtige Antwort sein. Ich würde löschen meine, aber ich kann nicht, weil es durch die OP ausgewählt wurde. Es gibt viel mehr zu Benchmarking als nur viele Iterationen ausgeführt wird, und JSPerf kümmert sich um das für Sie.

Andere Tipps

jsperf.com ist die Go-to-Website für die Prüfung JS Leistung. Starten Sie es. Wenn Sie einen Rahmen eigene Tests von der Kommandozeile für die Ausführung oder Skripte verwenden Benchmark.js , die Bibliothek, auf dem jsperf .com gebaut wird.

Hinweis: Jeder Javascript-Code zu testen, sollten sich auf die Tücken von „Microbenchmarks“ (kleine Tests, die eine bestimmte Funktion oder Operation Ziel, anstatt komplexere Tests basierend auf der realen Welt Codemuster) erziehen . Solche Tests können hilfreich sein, aber aufgrund der Ungenauigkeit anfällig sind, wie moderne JS Runtimes arbeiten. Vyacheslav Egorov Präsentation auf Leistung und Benchmarking ist sehenswert ein Gefühl für die Natur zu erhalten des Problems (s).

Edit:. Entfernte Verweise auf meine JSLitmus Arbeit, wie es ist einfach nicht mehr relevant oder nützlich

Hinzufügen nur einen schnellen Timer auf die Mischung, die jemand nützlich finden können:

var timer = function(name) {
    var start = new Date();
    return {
        stop: function() {
            var end  = new Date();
            var time = end.getTime() - start.getTime();
            console.log('Timer:', name, 'finished in', time, 'ms');
        }
    }
};

Im Idealfall wäre es in einer Klasse platziert wird, und nicht als global verwendet, wie ich oben zum Beispiel Zwecken tat. Mit ihm wäre ziemlich einfach:

var t = timer('Some label');
// code to benchmark
t.stop(); // prints the time elapsed to the js console

Nur einfache Art und Weise.

console.time('test');
console.timeEnd('test');

Ich habe diese einfache Implementierung @musicfreaks Antwort im Einsatz. Es sind keine Features, aber es ist wirklich einfach zu bedienen. Diese bench(function(){return 1/2;}, 10000, [], this) wird 1/2 10.000 Mal berechnen.

/**
 * Figure out how long it takes for a method to execute.
 * 
 * @param {Function} method to test 
 * @param {number} iterations number of executions.
 * @param {Array} args to pass in. 
 * @param {T} context the context to call the method in.
 * @return {number} the time it took, in milliseconds to execute.
 */
var bench = function (method, iterations, args, context) {

    var time = 0;
    var timer = function (action) {
        var d = Date.now();
        if (time < 1 || action === 'start') {
            time = d;
            return 0;
        } else if (action === 'stop') {
            var t = d - time;
            time = 0;    
            return t;
        } else {
            return d - time;    
        }
    };

    var result = [];
    var i = 0;
    timer('start');
    while (i < iterations) {
        result.push(method.apply(context, args));
        i++;
    }

    var execTime = timer('stop');

    if ( typeof console === "object") {
        console.log("Mean execution time was: ", execTime / iterations);
        console.log("Sum execution time was: ", execTime);
        console.log("Result of the method call was:", result[0]);
    }

    return execTime;  
};

Es ist wirklich schwer anständig Cross-Browser-Benchmarks zu schreiben. Einfach Timing ist eine vordefinierte Anzahl von Iterationen des Codes .

Wie @broofa bereits vorgeschlagen Besuche jsPerf . Es verwendet Benchmark.js hinter den Kulissen.

Wenn Sie eine benutzerdefinierte Benchmark-Skript sicher sein, zu beachten, dass das Schreiben einige Browser dom Manipulationen erst nach Funktion gelten, in dem sie definiert sind beendet. Weitere Details hier http://www.quirksmode.org/blog/archives/2009/08 /when_to_read_ou.html

Wenn Sie etwas Einfaches wie Sie dies tun können:

'use strict'
console.clear()

const powerOf = x => y => Math.pow(x, y)
const powerOfThree = powerOf(3)

function performanceCalc(fn, ...params) {
    const start = +new Date()
    const result = fn(...params)
    const end = +new Date()

    console.log(`Result: ${result}. Execution Time: ${end - start} ms`)
}

performanceCalc(powerOfThree, 2)

Hier ist ein Beispiel für den Code

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top