So messen Sie die Zeit, die eine Funktion zur Ausführung benötigt

Lesezeit: 10 Minuten

So messen Sie die Zeit die eine Funktion zur Ausfuhrung
Julius A

Ich brauche die Ausführungszeit in Millisekunden.

Ich habe diese Frage ursprünglich im Jahr 2008 gestellt. Die damals akzeptierte Antwort war zu verwenden new Date().getTime() Wir sind uns jetzt jedoch alle einig, dass die Verwendung des Standards performance.now() API ist besser geeignet. Ich ändere daher die akzeptierte Antwort in diese.

  • Oft kann sich eine Aussage darüber, was Sie mit der Ausführungszeit erreichen wollen, als weitaus nützlicher erweisen, als die Frage allein zu beantworten. Heutzutage ist die Verwendung von Profiling in Firebug- oder Chrome-Entwicklungstools oft eine weitaus bessere Möglichkeit, den Code zu finden, der Ihren CPU-Saft aufsaugt.

    – Oligofren

    6. März 2013 um 10:04 Uhr


  • performance.now() funktioniert nicht im Node. new Date().getTime() funktioniert in Node.

    – RyanWalker

    11. September 2018 um 22:50 Uhr

  • @RyanWalker oder noch einfacher Date.now()es funktioniert auch in node

    – f278f1b2

    1. November 2019 um 15:18 Uhr


  • @oligofren – Manchmal möchten Sie diese Daten vielleicht erfassen. Ich habe eine Situation, in der ich dies in indexedDB schreibe

    – ThomasRones

    8. April 2020 um 4:45 Uhr

  • Ich habe mich gefragt, ob es ein aktuelles Dokument (z. B. 2020/201) gibt, das besagt, dass performance.now() besser ist als Date.now() in node ?

    – Qiulang邱朗

    23. April 2021 um 7:00 Uhr


So messen Sie die Zeit die eine Funktion zur Ausfuhrung
vsync

Verwenden performance.now():

var startTime = performance.now()

doSomething()   // <---- measured code goes between startTime and endTime
    
var endTime = performance.now()

console.log(`Call to doSomething took ${endTime - startTime} milliseconds`)

Im Node.js Es ist erforderlich, die zu importieren performance Klasse

Leistung importieren

const { performance } = require('perf_hooks');

Verwenden Konsole.Zeit: (Lebensstandard)

console.time('doSomething')
    
doSomething()   // <---- The function you're measuring time for 
    
console.timeEnd('doSomething')

Notiz:
Die Zeichenfolge, die an die übergeben wird time() und timeEnd() Methoden müssen passen
(damit der Timer wie erwartet endet).

console.time() Dokumentationen:

  • Es wird jetzt auch von den Chrome Developer Tools unterstützt.

    – julien_c

    15. März 2012 um 11:00 Uhr

  • Dies ist derzeit der beste Weg, um genaue Timings zu sammeln, was ich verstehe.

    – Aschblau

    5. Mai 2012 um 2:18 Uhr

  • Müssen Sie die Funktion nicht zwischen diesen beiden Anweisungen ausführen? Sie messen jetzt die Zeit, die es braucht, um es zu definieren, nicht um es auszuführen. Korrigiert mich, wenn ich falsch liege…

    – Christian

    4. September 2012 um 22:06 Uhr

  • Link zum MDN-Artikel zu dieser Funktion: developer.mozilla.org/en-US/docs/DOM/console.time

    – Nichtigkeit

    19. Februar 2013 um 17:19 Uhr

  • Ja, Sie können `totalTime += console.timeEnd(‘timer’)’ machen und es für jeden Timer tun

    – vsync

    19. Juni 2013 um 15:28 Uhr

1646636715 879 So messen Sie die Zeit die eine Funktion zur Ausfuhrung
Owen

verwenden neues Datum().getTime()

Die Methode getTime() 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);

  • Beachten Sie, dass Sie den getTime()-Aufruf durch +new Date() ersetzen können: var start = +new Date(); // Do Stuff alert(“Execution time: “+(+new Date())-start);

    – J c

    24. November 2008 um 13:00 Uhr

  • Die Zeiten sind nicht genau, da Date nicht für diese Funktionalität vorgesehen ist. Ich werde hier mutig sein und sagen, dass Sie das Beispiel von vsync verwenden sollten, wenn Sie ein genaues Timing wünschen. Obwohl es nur in Chrome und Firefox ATM funktioniert.

    – Aschblau

    5. Mai 2012 um 2:17 Uhr

  • Achtung, getMilliseconds() gibt Ihnen den Millisekundenbruchteil der aktuellen Sekunde. Wenn Sie getTime() durch getMilliseconds() ersetzen, können Sie negative Ergebnisse erhalten, wenn Sie eine Sekunde überschreiten.

    – Ricky A

    10. Januar 2013 um 15:47 Uhr

  • Die Antwort von vsync ist nach heutigen Maßstäben weitaus korrekter, und die Verwendung von Date() kann dazu führen, dass sehr fehlerhafte Ergebnisse angezeigt werden, insbesondere auf der Windows-Plattform, wo die Ergebnisse auf die nächste 15-ms-Grenze gerundet und abgerundet werden können, was zu seltsamen Dingen wie z 0ms-Timings auf winzigen Codebits.

    – Oligofren

    6. März 2013 um 9:59 Uhr

  • @AshBlue, sollten wir verwenden window.performance.now. Siehe stackoverflow.com/a/15641427/632951

    – Schrittmacher

    2. November 2013 um 2:17 Uhr


1646636716 74 So messen Sie die Zeit die eine Funktion zur Ausfuhrung
Schrittmacher

Verwenden Sie nicht Date(). Lesen Sie unten.

Verwenden 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 ++

  • Chrom 24 ++

  • Safari 8 ++

  • Oper 15 ++

  • Android 4.4 ++

  • usw usw

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

Diese Funktion ist nicht standardmäßig und befindet sich nicht auf einer Standardspur. Verwenden Sie es nicht auf Produktionsstandorten, die dem Web zugewandt 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 Zukunft ändern.

Neben der Browserunterstützung performance.now scheint das zu haben Potenzial um genauere Timings bereitzustellen, da es sich anscheinend um die Bare-Bones-Version von handelt console.time.


Auch, NIEMALS verwenden Date zum irgendetwas weil es von Änderungen in der “Systemzeit” betroffen ist. Was bedeutet wir Wille ungültige Ergebnisse — wie „negatives Timing“ — erhalten, wenn der Benutzer keine genaue Systemzeit hat:

Am Oktober 2014 ging meine Systemuhr drunter und drüber erraten Sie, was…. Ich öffnete Gmail und sah alle meiner täglichen E-Mails “gesendet Vor 0 Minuten“. Und ich dachte, Google Mail sollte von Weltklasse-Ingenieuren von Google entwickelt werden…….

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

Google Spreadsheets now() Funktion leidet auch unter diesem Problem.

Die einzige Zeit, die Sie verwenden werden Date ist, wenn Sie dem Benutzer zeigen möchten seine Systemuhrzeit. Nicht, wenn Sie wollen der Zeit oder um irgendetwas zu messen.

  • Genau das, wonach ich gesucht habe! Ich möchte mehrere Male addieren können, das geht mit Konsolenzeiten nicht wirklich.

    – Strahl

    29. September 2013 um 13:33 Uhr

  • Beachten Sie, dass dies in Safari noch nicht unterstützt wird: developer.mozilla.org/en-US/docs/Web/API/Performance.now()

    – Ako K

    1. November 2013 um 21:11 Uhr

  • Ich verwende Firebug Profile und performance.now(), und beide funktionieren gut. Performance.now() bestätigt mein Ergebnis von Profile.

    – Vincent Jia

    11. Februar 2014 um 10:01 Uhr

  • Funktioniert nicht in meinem größten Problem, dem IE7 (Unternehmenskunden). Ich interessiere mich nicht für die Leistungsmessung in Chrome, es ist immer blitzschnell.

    – Nick

    3. März 2014 um 18:27 Uhr

  • Dies ist ein besserer Weg als console.time().

    – Sanjeev

    25. Januar 2015 um 12:15 Uhr

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

Alle modernen Browser haben integrierte JavaScript-Profiler. 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 profilieren Sie Ihr JavaScript:

  • Im ChromDrücken Sie F12 und wählen Sie die aus Profile Registerkarte, dann Sammeln Sie das JavaScript-CPU-Profil.
  • Im Feuerfuchsinstallieren/öffnen Sie Firebug und klicken Sie auf die Profil Taste.
  • Im IE 9+Drücken Sie F12klicke auf Skript oder Profiler (abhängig von Ihrer IE-Version).

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

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 zurückgibt timeEnd() Anruf. Die anderen Browser melden das Ergebnis einfach an die Entwicklerkonsole: den Rückgabewert von timeEnd() ist nicht definiert.

Wenn Sie die Funktionsausführungszeit in freier Wildbahn erhalten möchten, müssen Sie Ihren Code instrumentieren. Sie haben ein paar Möglichkeiten. Start- und Endzeit können Sie einfach per Abfrage speichern new Date().getTime():

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

Allerdings ist die Date Das Objekt hat nur eine Millisekundenauflösung und wird von Änderungen der Systemuhr des Betriebssystems beeinflusst. In modernen Browsern gibt es eine bessere Option.

Die bessere Option ist die Verwendung von Zeit mit hoher Auflösungauch bekannt window.performance.now(). now() ist besser als das traditionelle Date.getTime() auf zwei wichtige Arten:

  1. now() ist ein Double mit einer Auflösung von weniger als einer Millisekunde, das die Anzahl der Millisekunden seit dem Start der Seitennavigation darstellt. Es 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, da 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() wird ebenfalls aktualisiert. now() ist garantiert immer monoton ansteigend, wird also nicht von der Systemzeit des Betriebssystems beeinflusst – es wird immer die Wanduhrzeit sein (vorausgesetzt, Ihre Wanduhr ist nicht atomar …).

now() kann an fast jedem Ort eingesetzt werden new Date().getTime(), + new Date und T Date.now() sind. Die Ausnahme ist das Date und now() mal nicht mischen, wie Date basiert auf Unix-Epoche (die Anzahl der Millisekunden seit 1970), während now() ist die Anzahl der Millisekunden seit dem Start Ihrer 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 Polyfills erhältlich.

Eine weitere Möglichkeit zur Messung der Ausführungszeit in freier Wildbahn ist Benutzertiming. UserTiming verhält sich ähnlich wie console.time() und console.timeEnd()aber es verwendet denselben hochauflösenden Zeitstempel wie now() verwendet (so erhalten Sie eine sub-Millisekunde monoton ansteigende Uhr) und speichert die Zeitstempel und Dauern in der PerformanceTimeline.

UserTiming hat die Konzepte von markiert (Zeitstempel) und Maße (Dauer). Sie können so viele von beiden definieren, wie Sie möchten, und sie werden auf dem angezeigt PerformanceTimeline.

Um einen Zeitstempel zu speichern, rufen Sie an mark(startMarkName). Um die Dauer seit Ihrer ersten Markierung zu erfahren, rufen Sie einfach an measure(measurename, startMarkname). Die Dauer wird dann zusammen mit Ihren Noten in der 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).

1646636716 429 So messen Sie die Zeit die eine Funktion zur Ausfuhrung
Warwara Kalinina

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() eignen sich nicht zum Messen der genauen Ausführungszeit. Sie können sie verwenden, wenn eine schnelle grobe Schätzung für Sie in Ordnung ist. Als grobe Schätzung meine ich, dass Sie eine Verschiebung von 15 bis 60 ms gegenüber der Echtzeit erhalten können.

Überprüfen Sie dies brillant Post zum Messen der Ausführungszeit in JavaScript. Der Autor gibt auch ein paar Links zur Genauigkeit der JavaScript-Zeit, die es wert sind, gelesen zu werden.

So messen Sie die Zeit die eine Funktion zur Ausfuhrung
Stefan Mai

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

Eine einfache Lösung, Sie können auch hier den Operator add verwenden

 var start = +new Date();
 callYourFunctionHere();
 var end = +new Date();
 var time = end - start;
 console.log('total execution time="+ time + "ms');

  • Danke , aber was ist das + in +new Date() ?. Vielleicht erzwingst du das Casting zu Number?

    – Bardelmann

    2. Juli 2021 um 9:00 Uhr


  • @Bardelman Genau Es ist dasselbe wie Number(new Date()).

    – Alok Deshwal

    2. Juli 2021 um 9:16 Uhr


963820cookie-checkSo messen Sie die Zeit, die eine Funktion zur Ausführung benötigt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy