Ich brauche die Ausführungszeit in Millisekunden.
Ich habe diese Frage ursprünglich im Jahr 2008 gestellt. Die akzeptierte Antwort war dann die Verwendung von new Date (). GetTime () Wir können uns jedoch jetzt alle darauf einigen, dass die Verwendung der Standard- API performance.now () angemessener ist. Ich ändere daher die akzeptierte Antwort auf diese.
javascript
profiling
Julius A.
quelle
quelle
Date
Weise tun können, was Ihnen gibtms
und für die meisten Fälle ausreicht, denke ich, albertech.blogspot.com/2015/07/… ... aber ja, Sie sollten es sich wirklich ansehenPerformance.now
performance.now()
funktioniert nicht in Node.new Date().getTime()
wird in Node funktionieren.Antworten:
Verwenden von performance.now () :
Verwenden von console.time :
(nicht standard)( Lebensstandard )Hinweis :
Die Zeichenfolge, die an dieMethoden
time()
und übergeben wirdtimeEnd()
, muss übereinstimmen(damit der Timer wie erwartet endet).
quelle
benutze neues Date (). getTime ()
Ex.
quelle
window.performance.now
. Siehe stackoverflow.com/a/15641427/632951Verwenden Sie nicht Date (). Lesen Sie unten.
Verwendung
performance.now()
:Es funktioniert auf:
IE 10 ++
FireFox 15 ++
Chrome 24 ++
Safari 8 ++
Opera 15 ++
Android 4.4 ++
usw. usw.
console.time
mag für Sie lebensfähig sein , aber es ist nicht Standard § :Neben der Browserunterstützung
performance.now
scheint das Potenzial zu bestehen, genauere Timings bereitzustellen, da es sich anscheinend um die Bare-Bones-Version von handeltconsole.time
.<rant> Verwenden Sie
Date
es NIEMALS für irgendetwas, da es durch Änderungen der "Systemzeit" beeinflusst wird. Das heißt , wir werden ungültige Ergebnisse -ähnlichen „negatives Timing“ erhalten - wenn der Benutzer nicht eine genaue Systemzeit hat:(Stellen Sie Ihre Systemuhr auf vor einem Jahr ein und gehen Sie zu Google Mail, damit wir alle gut lachen können. Vielleicht haben wir eines Tages eine Hall of Shame für JS
Date
.)Die
now()
Funktion von Google Spreadsheet leidet ebenfalls unter diesem Problem.Die einzige Zeit, die Sie verwenden,
Date
ist, wenn Sie dem Benutzer seine Systemuhrzeit anzeigen möchten . Nicht , wenn Sie erhalten möchten die Zeit oder Maßnahme nichts.quelle
Wenn Sie die Ausführungszeit für Funktionen auf Ihrem lokalen Entwicklungscomputer benötigen , können Sie entweder die Profiling-Tools Ihres Browsers oder Konsolenbefehle wie
console.time()
und verwendenconsole.timeEnd()
.In allen modernen Browsern sind JavaScript-Profiler integriert. Diese Profiler sollten die genaueste Messung liefern, da Sie Ihren vorhandenen Code nicht ändern müssen, da dies die Ausführungszeit der Funktion beeinträchtigen könnte.
So profilieren Sie Ihr JavaScript:
Alternativ können Sie auf Ihrem Entwicklungscomputer Ihrem Code mit
console.time()
und Instrumente hinzufügenconsole.timeEnd()
. Diese Funktionen, die in Firefox11 +, Chrome2 + und IE11 + unterstützt werden, berichten über Timer, über die Sie starten / stoppenconsole.time()
.time()
Nimmt einen benutzerdefinierten Timernamen als Argument undtimeEnd()
berichtet dann über die Ausführungszeit seit dem Start des Timers:Beachten Sie, dass nur Firefox die verstrichene Zeit im
timeEnd()
Anruf zurückgibt . Die anderen Browser melden das Ergebnis einfach an die Entwicklerkonsole: Der Rückgabewert vontimeEnd()
ist undefiniert.Wenn Sie die Ausführungszeit von Funktionen in freier Wildbahn erhalten möchten , müssen Sie Ihren Code instrumentieren. Sie haben ein paar Möglichkeiten. Sie können die Start- und Endzeiten einfach speichern, indem Sie Folgendes abfragen
new Date().getTime()
:Das
Date
Objekt hat jedoch nur eine Millisekundenauflösung und wird von Änderungen der Systemuhr eines Betriebssystems beeinflusst. In modernen Browsern gibt es eine bessere Option.Die bessere Option ist die Verwendung der hochauflösenden Zeit , auch bekannt als
window.performance.now()
.now()
istDate.getTime()
in zweierlei Hinsicht besser als das Traditionelle :now()
ist ein Double mit einer Auflösung von Submillisekunden, 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).now()
nimmt monoton zu. Dies ist wichtig, da es bei nachfolgenden Anrufen möglicherweise vorwärts oder sogar rückwärts springenDate.getTime()
kann . Insbesondere wenn die Systemzeit des Betriebssystems aktualisiert wird (z. B. Atomuhrsynchronisation), wird dies ebenfalls aktualisiert. wird garantiert immer monoton ansteigen, so dass es nicht von der Systemzeit des Betriebssystems beeinflusst wird - es wird immer die Wanduhrzeit sein (vorausgesetzt, Ihre Wanduhr ist nicht atomar ...).Date.getTime()
now()
now()
kann an fast jedem Ort verwendet werdennew Date().getTime()
, an dem es+ new Date
keineDate.now()
gibt. Die Ausnahme ist , dassDate
undnow()
mal nicht mische, daDate
auf Basis Unix-Epoche (die Anzahl der Millisekunden seit 1970), währendnow()
die Anzahl der Millisekunden seit Ihrer Seite der Navigation gestartet (so ist es viel kleiner als seinDate
).Hier ist ein Beispiel für die Verwendung
now()
:now()
wird in Chrome Stable, Firefox 15+ und IE10 unterstützt. Es gibt auch mehrere Polyfills .Eine weitere Option zum Messen der Ausführungszeit in freier Wildbahn ist UserTiming . UserTiming verhält sich ähnlich wie
console.time()
undconsole.timeEnd()
, verwendet jedoch denselben hochauflösenden Zeitstempel wie Sienow()
(sodass Sie eine monoton ansteigende Uhr im Submillisekundenbereich erhalten) und speichert die Zeitstempel und die Dauer in der PerformanceTimeline .UserTiming hat die Konzepte von Markierungen (Zeitstempeln) und Kennzahlen (Dauer). Sie können so viele von beiden definieren, wie Sie möchten, und sie werden in der PerformanceTimeline angezeigt .
Um einen Zeitstempel zu speichern, rufen Sie an
mark(startMarkName)
. Um die Dauer seit Ihrer ersten Markierung zu ermitteln, rufen Sie einfach anmeasure(measurename, startMarkname)
. Die Dauer wird dann in der PerformanceTimeline neben Ihren Markierungen gespeichert.UserTiming ist in IE10 + und Chrome25 + verfügbar. Es gibt auch eine Polyfüllung (die ich geschrieben habe).
quelle
performance.now
undDate
ist der Grund, warum es existiert.Um genaue Werte zu erhalten, sollten Sie die Leistungsschnittstelle verwenden . Es wird in modernen Versionen von Firefox, Chrome, Opera und IE unterstützt. Hier ist ein Beispiel, wie es verwendet werden kann:
Date.getTime()
oderconsole.time()
sind nicht gut für die Messung der genauen Ausführungszeit. Sie können sie verwenden, wenn eine schnelle grobe Schätzung für Sie in Ordnung ist. Mit groben Schätzungen meine ich, dass Sie eine Verschiebung von 15-60 ms von der Echtzeit erhalten können.Überprüfen Sie diesen brillanten Beitrag zum Messen der Ausführungszeit in JavaScript. Der Autor gibt auch ein paar Links über die Genauigkeit der JavaScript-Zeit, die es wert sind, gelesen zu werden.
quelle
Verwenden Sie Firebug, aktivieren Sie sowohl Console als auch Javascript. Klicken Sie auf Profil. Neu laden. Klicken Sie erneut auf Profil. Zeigen Sie den Bericht an.
quelle
console.time()
undconsole.timeEnd()
jetzt auch.Benchmark
Ausgabe
performance.now () ist optional - übergeben Sie einfach false an die StopWatch-Konstruktorfunktion.
quelle
process.hrtime () ist in Node.js verfügbar - es gibt einen Wert in Nanosekunden zurück
quelle
hrtime[0] * 1000 + hrtime[1] / 1000000
-> Ja, ich verwende es auch liebervar hrtime
! : PSie können den Operator add auch hier verwenden
quelle
Verwenden Sie diesen kleinen Code, um den Code von vsync weiter zu erweitern und das timeEnd als Wert in NodeJS zurückzugeben.
Verwenden Sie nun den Code wie folgt:
Dies gibt Ihnen mehr Möglichkeiten. Sie können die Ausführungszeit speichern, die für andere Zwecke verwendet werden soll, z. B. für die Verwendung in Gleichungen oder in einer Datenbank, die über Websockets an einen Remoteclient gesendet, auf einer Webseite usw. bereitgestellt wird.
quelle
Es kann nur eine Variable verwendet werden:
timer/1000
- um Millisekunden in Sekunden umzuwandeln.toFixed(5)
- um zusätzliche Ziffern zu kürzenquelle
Da
console.time
undperformance.now
nicht in einigen gängigen Browsern (dh IE10) unterstützt werden, habe ich ein schlankes Programm , das die besten verfügbaren Methoden verwendet. Es fehlt jedoch die Fehlerbehandlung für falsche Verwendungen (AufrufenEnd()
eines nicht initialisierten Timers).Verwenden Sie es und verbessern Sie es, wie Sie wollen.
quelle
Es kann Ihnen helfen.
var t0 = date.now(); doSomething(); var t1 = date.now(); console.log("Call to doSomething took approximate" + (t1 - t0)/1000 + " seconds.")
quelle
Hier ist ein Dekorator für Timing-Funktionen
Verwendungszweck:
Wenn Sie asynchrone Funktionen verwenden, können Sie
timed
asynchronisieren und einawait
vor f (... args) hinzufügen , und das sollte für diese funktionieren. Es wird komplizierter, wenn ein Dekorateur sowohl Synchronisierungs- als auch Asynchronisierungsfunktionen ausführen soll.quelle
Danke, Achim Koellner, wird Ihre Antwort ein wenig erweitern:
Bitte beachten Sie, dass Sie nichts anderes tun sollten als das, was Sie messen möchten (z. B.
console.log
dauert die Ausführung auch einige Zeit und wirkt sich auf Leistungstests aus).Beachten Sie, dass Sie, um die Ausführungszeit für asynchrone Funktionen zu messen,
var timeInMilliseconds = process.hrtime(t0)[1]/1000000;
in den Rückruf einfügen sollten . Zum Beispiel,quelle
Vor ein paar Monaten habe ich meine eigene Routine zusammengestellt, die eine Funktion mit Date.now () mal erstellt - obwohl zu der Zeit die akzeptierte Methode performance.now () zu sein schien -, weil das Performance-Objekt noch nicht verfügbar ist (erstellt) -in) in der stabilen Version von Node.js.
Heute habe ich etwas mehr recherchiert und eine andere Methode für das Timing gefunden. Da ich auch herausgefunden habe, wie man dies in Node.js Code verwendet, dachte ich, ich würde es hier teilen.
Folgendes wird aus den Beispielen von w3c und Node.js kombiniert :
HINWEIS:
Wenn Sie das
performance
Objekt in einer Node.js-App verwenden möchten, müssen Sie Folgendes angeben:const { performance } = require('perf_hooks')
quelle
performance.mark('end')
in diesem Fall nichtEs gibt mehrere Möglichkeiten, um dieses Ziel zu erreichen:
mit console.time
Dies ist der effizienteste Weg: Verwenden von performance.now () , z
benutze + (Operator hinzufügen) oder getTime ()
Folgendes passiert, wenn Sie den unären Plus-Operator auf eine Datumsinstanz anwenden: Abrufen des Werts der betreffenden Datumsinstanz Konvertieren Sie ihn in eine Zahl
HINWEIS: Bietet
getTime()
eine bessere Leistung als der unäre + Operator.quelle
InitTime im Zusammenhang mit
string
.return Singleton.getInstance().initTime(label); // Returns the time init
return Singleton.getInstance().endTime(label); // Returns the total time between init and end
quelle
Wenn Sie die Zeit zwischen mehreren Dingen messen möchten, die nicht verschachtelt sind, können Sie Folgendes verwenden:
Ähnlich wie console.time (), jedoch einfacher zu verwenden, wenn Sie frühere Timer nicht nachverfolgen müssen.
Wenn Ihnen die blaue Farbe von console.time () gefällt, können Sie stattdessen diese Zeile verwenden
quelle
In meinem Fall bevorzuge ich @ grammar suger und kompiliere es mit babel.
Das Problem dieser Methode ist, dass sich die Funktion innerhalb des Objekts befinden muss.
Beispiel für einen JS-Code
.babelrc (für babel 6)
quelle
Stoppuhr mit kumulativen Zyklen
Funktioniert mit Server und Client (Knoten oder DOM), verwendet die
Performance
API. Gut, wenn Sie viele kleine Zyklen haben, z. B. in einer 1000-mal aufgerufenen Funktion, die 1000 Datenobjekte verarbeitet, aber Sie möchten sehen, wie sich jede Operation in dieser Funktion zur Gesamtsumme summiert.Dieser verwendet also einen globalen (Singleton-) Timer für Module. Wie ein Klassen-Singleton-Muster, nur etwas einfacher zu verwenden, aber Sie müssen dies in einer separaten zB
stopwatch.js
Datei ablegen.quelle
Der beste Weg wäre, das
performance hooks
Modul zu verwenden. Obwohl instabil, können Siemark
bestimmte Bereiche Ihres Codes undmeasure
dieduration
zwischen markierten Bereiche festlegen.Versuchen Sie es hier
quelle
quelle
Mit Leistung
NodeJs: Es ist erforderlich, die Leistungsklasse zu importieren
Verwenden von console.time
quelle
console.time("myTimer");
console.timeLog("myTimer");
console.timeEnd("myTimer");
Weitere Informationen hierzu finden Sie auf MDN und in der Node.js-Dokumentation .
Verfügbar für Chrome, Firefox, Opera und NodeJS. (nicht auf Edge oder Internet Explorer).
quelle
Wie bereits erwähnt, prüfen und verwenden Sie den eingebauten Timer. Aber wenn Sie hier Ihre eigenen schreiben wollen oder müssen, sind meine zwei Cent:
Die Zusammenstellung war ein Erfolg!
quelle
Die akzeptierte Antwort ist falsch !
Da JavaScript asynchron ist, wären die Werte des variablen Endes der akzeptierten Antwort falsch.
Die Ausführung von for kann sehr schnell sein, sodass Sie nicht sehen können, dass das Ergebnis falsch ist. Sie können es mit einem Code testen, der eine Anfrage ausführt:
Die Warnung wird also sehr schnell angezeigt, aber in der Konsole sehen Sie, dass die Ajax-Anforderungen fortgesetzt werden.
So sollten Sie es tun: https://developer.mozilla.org/en-US/docs/Web/API/Performance.now
quelle