Frage Wie man die Zeit misst, die von einer auszuführenden Funktion benötigt wird


Ich brauche die Ausführungszeit in Millisekunden.

Ich habe diese Frage ursprünglich im Jahr 2008 gestellt. Die akzeptierte Antwort   dann war zu benutzen neues Date (). getTime () Aber wir können uns jetzt alle einig sein   das mit dem Standard performance.now () API ist mehr   angemessen. Ich ändere daher die angenommene Antwort auf diese.


786
2017-11-24 11:09


Ursprung


Antworten:


Sie können verwenden console.time: (Nicht-Standard)

console.time('someFunction');

someFunction(); // run whatever needs to be timed in between the statements

console.timeEnd('someFunction');

Hinweis:


1148
2017-12-29 15:05



benutzen neues Date (). getTime ()

Die getTime () -Methode gibt die Anzahl der Millisekunden seit Mitternacht des 1. Januar 1970 zurück.

Ex.

var start = new Date().getTime();

for (i = 0; i < 50000; ++i) {
// do something
}

var end = new Date().getTime();
var time = end - start;
alert('Execution time: ' + time);

572
2017-11-24 11:15



Verwenden Sie nicht Datum (). Lesen Sie weiter unten.

Benutzen performance.now():

<script>
var a = performance.now();
alert('do something...');
var b = performance.now();
alert('It took ' + (b - a) + ' ms.');
</script>

Es funktioniert auf:

  • IE 10 ++

  • FireFox 15 ++

  • Chrome 24 ++

  • Safari 8 ++

  • Opera 15 ++

  • Android 4.4 ++

  • usw. usw

console.time kann lebensfähig sein für dichaber es ist nicht Standard §:

Diese Funktion ist nicht standardisiert und befindet sich nicht auf einer Standardspur. Verwenden Sie es nicht auf Websites, die mit dem Internet verbunden sind: Es funktioniert nicht für jeden Benutzer. Dort können auch große Inkompatibilitäten zwischen Implementierungen sein und das Verhalten kann sich in der Zukunft ändern.

Neben der Browserunterstützung, performance.now scheint das zu haben Potenzial um genauere Zeiten zu liefern, wie es scheint, die nackte Version von zu sein console.time.


<rant> Auch NICHT benutzen Date zum etwas weil es von Änderungen in der "Systemzeit" betroffen ist. Was wir bedeuten werden ungültige Ergebnisse erhalten - wie "negatives Timing" - wenn der Benutzer keine genaue Systemzeit hat:

Im Oktober 2014 ging meine Systemuhr drunter und drüber erraten Sie, was.... Ich öffnete Gmail und sah alle der E-Mails meines Tages "gesendet Vor 0 Minuten"Und ich dachte, Gmail soll von Weltklasse-Ingenieuren von Google gebaut werden .......

(Setzen Sie Ihre Systemuhr auf ein Jahr und gehen Sie zu Google Mail, damit wir alle gut lachen können. Vielleicht werden wir eines Tages eine Halle der Schande für JS Date.)

Google Tabellenkalkulation now() Funktion leidet auch an diesem Problem.

Die einzige Zeit, die du benutzt wirst Date ist, wenn Sie den Benutzer zeigen möchten seine Systemuhrzeit. Nicht wenn du willst das Zeit oder um irgendetwas zu messen.


376
2018-03-26 15:49



Wenn Sie auf Ihrem lokalen Entwicklungscomputer Funktionsausführungszeit benötigenkönnen Sie entweder die Profiling-Tools Ihres Browsers oder Konsolenbefehle wie console.time() und console.timeEnd().

Alle modernen Browser haben JavaScript-Profiler eingebaut. Diese Profiler sollten die genaueste Messung liefern, da Sie Ihren vorhandenen Code nicht ändern müssen, was sich auf die Ausführungszeit der Funktion auswirken könnte.

So profilierst du dein JavaScript:

  • Im Chrom, Drücken Sie F12 und wählen Sie die Profile Tab, dann Sammeln Sie das JavaScript-CPU-Profil.
  • Im Feuerfuchs, installiere / öffne Firebug und klicke auf Profil Taste.
  • Im IE 9+, Drücken Sie F12, klicke auf Skript oder Profiler (abhängig von Ihrer Version von IE).

Alternativ auf Ihrer EntwicklungsmaschineSie können Ihrem Code Instrumentierung hinzufügen console.time() und console.timeEnd(). Diese Funktionen, die in Firefox11 +, Chrome2 + und IE11 + unterstützt werden, berichten über Timer, über die Sie starten / stoppen console.time(). time() nimmt einen benutzerdefinierten Timer-Namen als Argument und timeEnd() gibt dann die Ausführungszeit seit dem Start des Timers an:

function a() {
  console.time("mytimer");
  ... do stuff ...
  var dur = console.timeEnd("myTimer"); // NOTE: dur only works in FF
}

Beachten Sie, dass nur Firefox die verstrichene Zeit in der timeEnd() Anruf. Die anderen Browser melden das Ergebnis einfach an die Entwicklerkonsole: Der Rückgabewert von timeEnd() ist nicht definiert.

Wenn Sie die Zeit für die Ausführung der Funktionen frei haben wollen, müssen Sie Ihren Code instrumentieren. Sie haben ein paar Optionen. Sie können die Start- und Endzeiten einfach durch Abfragen speichern new Date().getTime():

function a() {
  var start = new Date().getTime();
  ... do stuff ...
  var end = new Date().getTime();
  var dur = end - start;
}

Aber die Date Das Objekt hat nur eine Millisekunden-Auflösung und wird von den Systemtaktänderungen jedes Betriebssystems beeinflusst. In modernen Browsern gibt es eine bessere Option.

Die bessere Option ist die Verwendung der Hohe Auflösungszeit, aka window.performance.now(). now() ist besser als das Traditionelle Date.getTime() in zwei wichtigen Punkten:

  1. now() ist ein Double mit einer Auflösung von weniger als einer Millisekunde, das die Anzahl der Millisekunden seit Beginn der Seitennavigation darstellt. Sie gibt die Anzahl der Mikrosekunden im Bruchteil zurück (z. B. ein Wert von 1000,123 ist 1 Sekunde und 123 Mikrosekunden).

  2. now() ist monoton steigend. Dies ist wichtig als Date.getTime() kann möglicherweise bei nachfolgenden Aufrufen vorwärts oder sogar rückwärts springen. Insbesondere, wenn die Systemzeit des Betriebssystems aktualisiert wird (z. B. Atomuhrsynchronisation), Date.getTime() ist auch aktualisiert. now() ist garantiert immer monoton ansteigend, so dass es nicht von der Systemzeit des Betriebssystems beeinflusst wird - es wird immer Wanduhrzeit sein (vorausgesetzt, Ihre Wanduhr ist nicht atomar ...).

now() kann an fast jedem Ort verwendet werden new Date().getTime(), + new Date und T Date.now() sind. Die Ausnahme ist das Date und now() Zeiten vermischen sich nicht, als Date basiert auf Unix-Epoche (Die Anzahl der Millisekunden seit 1970), während now() ist die Anzahl der Millisekunden seit Beginn der Seitennavigation (also viel kleiner als Date).

Hier ist ein Beispiel für die Verwendung now():

function a() {
  var start = window.performance.now();
   ... do stuff ...
  var end = window.performance.now();
  var dur = end - start;
}

now() wird in Chrome Stable, Firefox 15+ und IE10 unterstützt. Es gibt auch mehrere Polyfüllungen verfügbar.

Eine andere Möglichkeit, die Ausführungszeit in freier Wildbahn zu messen, ist Benutzerzeitmessung. UserTiming verhält sich ähnlich wie console.time() und console.timeEnd(), aber es verwendet den gleichen High Resolution Timestamp now() verwendet (so erhalten Sie einen monoton steigenden Takt von unter einer Millisekunde) und speichert die Zeitstempel und -dauern in der Leistungszeitlinie.

UserTiming hat die Konzepte von Marken (Zeitstempel) und Maße (Dauer). Sie können so viele von ihnen definieren, wie Sie möchten, und sie sind auf der Website verfügbar Leistungszeitlinie.

Um einen Zeitstempel zu speichern, rufen Sie an mark(startMarkName). Um die Dauer seit Ihrer ersten Mark zu erhalten, rufen Sie einfach an measure(measurename, startMarkname). Die Dauer wird dann zusammen mit Ihren Noten im PerformanceTimeline gespeichert.

function a() {
  window.performance.mark("start");
  ... do stuff ...
  window.performance.measure("myfunctionduration", "start");
}

// duration is window.performance.getEntriesByName("myfunctionduration", "measure")[0];

UserTiming ist in IE10 + und Chrome25 + verfügbar. Da ist auch ein Polyfill verfügbar (was ich geschrieben habe).


44
2018-01-14 19:01



Um genaue Werte zu erhalten, sollten Sie verwenden Leistungsschnittstelle. Es wird in modernen Versionen von Firefox, Chrome, Opera und IE unterstützt. Hier ist ein Beispiel, wie es verwendet werden kann:

var performance = window.performance;
var t0 = performance.now();
doWork();
var t1 = performance.now();
console.log("Call to doWork took " + (t1 - t0) + " milliseconds.")

Date.getTime() oder console.time() sind nicht gut zum Messen der genauen Ausführungszeit. Sie können sie verwenden, wenn eine schnelle grobe Schätzung für Sie in Ordnung ist. Durch grobe Schätzung meine ich, dass Sie 15-60 ms Verschiebung von der Echtzeit bekommen können.

Überprüfen Sie das brilliant Post zum Messen der Ausführungszeit in JavaScript. Der Autor gibt auch ein paar Links über die Genauigkeit der JavaScript-Zeit, lesenswert.


28
2018-02-26 16:13



Verwenden Sie Firebug, aktivieren Sie sowohl die Konsole als auch das Javascript. Klicken Sie auf Profil. Neu laden. Klicken Sie erneut auf Profil. Zeigen Sie den Bericht an.


17
2017-11-24 11:14



var StopWatch = function (performance) {
    this.startTime = 0;
    this.stopTime = 0;
    this.running = false;
    this.performance = performance === false ? false : !!window.performance;
};

StopWatch.prototype.currentTime = function () {
    return this.performance ? window.performance.now() : new Date().getTime();
};

StopWatch.prototype.start = function () {
    this.startTime = this.currentTime();
    this.running = true;
};

StopWatch.prototype.stop = function () {
    this.stopTime = this.currentTime();
    this.running = false;
};

StopWatch.prototype.getElapsedMilliseconds = function () {
    if (this.running) {
        this.stopTime = this.currentTime();
    }

    return this.stopTime - this.startTime;
};

StopWatch.prototype.getElapsedSeconds = function () {
    return this.getElapsedMilliseconds() / 1000;
};

StopWatch.prototype.printElapsed = function (name) {
    var currentName = name || 'Elapsed:';

    console.log(currentName, '[' + this.getElapsedMilliseconds() + 'ms]', '[' + this.getElapsedSeconds() + 's]');
};

Benchmark

var stopwatch = new StopWatch();
stopwatch.start();

for (var index = 0; index < 100; index++) {
    stopwatch.printElapsed('Instance[' + index + ']');
}

stopwatch.stop();

stopwatch.printElapsed();

Ausgabe

Instance[0] [0ms] [0s]
Instance[1] [2.999999967869371ms] [0.002999999967869371s]
Instance[2] [2.999999967869371ms] [0.002999999967869371s]
/* ... */
Instance[99] [10.999999998603016ms] [0.010999999998603016s]
Elapsed: [10.999999998603016ms] [0.010999999998603016s]

performance.now () ist optional - übergeben Sie einfach false in die StopWatch-Konstruktorfunktion.


10
2017-08-08 18:54



process.hrtime () ist in verfügbar Node.js - Es gibt einen Wert in Nanosekunden zurück

var hrTime = process.hrtime()
console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)

9
2018-03-11 09:49