2009-06-16 8 views
78

Gibt es ein Paket, das mir hilft, JavaScript-Code zu bewerten? Ich beziehe mich nicht auf Firebug und solche Werkzeuge.Wie kann ich JavaScript-Code bewerten?

Ich muss 2 verschiedene JavaScript-Funktionen vergleichen, die ich implementiert habe. Ich bin sehr vertraut mit Perls Benchmark (Benchmark.pm) Modul und ich bin auf der Suche nach etwas ähnlichem in JavaScript.

Hat der Schwerpunkt auf Benchmarking JavaScript-Code über Bord gegangen? Kann ich mit dem Timing nur einen Durchlauf der Funktionen durchgehen?

+0

Scheint ein dup zu sein: http://stackoverflow.com/search?q=javascript+profiler – steamer25

+0

Mögliche Duplikat [? Wie beurteilen Sie die Leistung Test JavaScript-Code] (http://stackoverflow.com/questions/111368/how-do-you-performance-test-javascript-code) –

+0

Ich weiß, es ist nicht kugelsicher und alles, aber trotzdem verwandt: manchmal will man nur wissen [wie man die Zeit misst, die eine Funktion zur Ausführung benötigt] (http://stackoverflow.com/a/15641427/812102). –

Antwort

22

Nur Zeit mehrere Iterationen jeder Funktion. Eine Iteration wird wahrscheinlich nicht genug sein, aber (je nachdem, wie komplex Ihre Funktionen sind), sollten etwas näher bei 100 oder sogar 1000 Iterationen die Aufgabe erfüllen.

Firebug hat auch eine profiler, wenn Sie sehen möchten, welche Teile Ihrer Funktion es verlangsamen.

Edit: Um zukünftige Leser, die unten Antwort JSPerf Empfehlung sollte die richtige Antwort sein. Ich würde meine löschen, aber ich kann nicht, weil es vom OP ausgewählt wurde. Benchmarking ist viel mehr als nur das Ausführen vieler Iterationen, und JSPerf kümmert sich darum.

+12

Einfaches Timing einer vordefinierten Anzahl von Iterationen Ihres Codes ist [nicht kugelsicher] (http://calendar.perfplanet.com/2010/bulletproof-javascript-benchmarks /). Wenn Firebug open aktiviert ist, wird der Just-In-Time (JIT) -Compiler von Firefox deaktiviert, was bedeutet, dass die Tests im Interpreter ausgeführt werden, d. H. Viel langsamer als sonst. Wenn Sie den Profiler von Firebug verwenden, erhalten Sie nicht die Ergebnisse, die Sie erwarten würden. –

+1

@Mathias: Nun, um fair zu sein, diese Antwort ist wirklich alt. –

+2

Sicher, nichts für ungut, Kumpel. Ich dachte nur, ich würde mich für zukünftige Hinweise dazu äußern, dass mehr Forschung zu diesem Thema gemacht wurde. –

88

jsperf.com ist die Einstiegsseite zum Testen der JS-Leistung. Fang dort an. Wenn Sie ein Framework zum Ausführen eigener Tests über die Befehlszeile oder Skripts benötigen, verwenden Sie Benchmark.js, die Bibliothek, auf der jsperf.com erstellt wird.

Hinweis: Jeder, der JavaScript-Code testet, sollte sich über die Fallstricke von "Microbenchmarks" (kleine Tests, die auf eine bestimmte Funktion oder Operation abzielen, statt komplexere Tests auf Basis von realen Codemustern) informieren. Solche Tests können nützlich sein, sind aber anfällig für Ungenauigkeiten aufgrund der Funktionsweise moderner JS-Laufzeiten. Vyacheslav Egorov's presentation on performance and benchmarking ist es wert, beobachtet zu werden, um ein Gefühl für die Art des Problems (der Probleme) zu bekommen.

Bearbeiten: Entfernt Referenzen zu meinem JSLitmus Arbeit, wie es nur nicht mehr relevant oder nützlich ist.

+3

Update: Verwenden Sie einfach jsperf.com - es ist viel besser geworden und funktioniert wirklich gut für diese Art von Sache. jslitmus funktioniert immer noch, wurde aber seit einiger Zeit nicht mehr aktiv entwickelt. – broofa

+0

Dies ist die überlegene Antwort. +1 –

+1

Ich wollte Jsperf verwenden, aber es scheint zu zählen, wie oft es den Code für einen Zeitraum ausführen kann, anstatt den tatsächlichen Aufruf für N-Schleifen zu timing. Ich wünschte, sie hätten eine Wahlmöglichkeit. – Jeach

19

Ich habe diese einfache Implementierung von @musicfreaks Antwort verwendet. Es gibt keine Funktionen, aber es ist wirklich einfach zu bedienen. Diese bench(function(){return 1/2;}, 10000, [], this) berechnet 1/2 10.000 mal.

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

Es ist wirklich schwer anständig Cross-Browser-Benchmarks zu schreiben. Sie können einfach eine vordefinierte Anzahl von Iterationen Ihres Codes zeitlich festlegen: not bulletproof at all.

Wie @broofa bereits vorgeschlagen, überprüfen Sie jsPerf. Es verwendet Benchmark.js hinter den Kulissen.

49

einfach eine kurze Timer in den Mix, 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'); 
     } 
    } 
}; 

Ideal wäre es in einer Klasse platziert werden, und nicht als globale verwendet wie ich für Beispielzwecke oben.Mit ihm wäre ziemlich einfach:

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

Gute Verwendung von Verschlüssen hier. – Dandy

+4

Für ein genaueres Ergebnis könnte man 'performance.now() 'anstelle von' Date() 'https://developer.mozilla.org/en-US/docs/Web/API/Performance/now – thormeier

+0

verwenden Genau was ich brauchte - ein timeIt() – Gishu

1

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) 

Here is an example of the code

+0

Einfach war definitiv die beste Option in meinem Fall ... einige Tests zu Benchmark-Antwortzeiten für API schreiben (keine Notwendigkeit für extrem genau mal). – kashiraja

5

Nur einfache Art und Weise.

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