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 verwenden console.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:
- Drücken Sie in Chrome F12 und wählen Sie die Registerkarte Profile und dann JavaScript-CPU-Profil erfassen .
- Installieren / öffnen Sie in Firefox Firebug und klicken Sie auf die Schaltfläche Profil .
- Drücken Sie in IE 9+ F12 , klicken Sie auf Skript oder Profiler (abhängig von Ihrer IE-Version).
Alternativ können Sie auf Ihrem Entwicklungscomputer Ihrem Code mit console.time()
und Instrumente hinzufügen 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 Timernamen als Argument und timeEnd()
berichtet dann über 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 im timeEnd()
Anruf zurückgibt . Die anderen Browser melden das Ergebnis einfach an die Entwicklerkonsole: Der Rückgabewert von timeEnd()
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()
:
function a() {
var start = new Date().getTime();
... do stuff ...
var end = new Date().getTime();
var dur = end - start;
}
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()
ist Date.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 springen Date.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 werden new Date().getTime()
, an dem es + new Date
keine Date.now()
gibt. Die Ausnahme ist , dass Date
und now()
mal nicht mische, da Date
auf Basis Unix-Epoche (die Anzahl der Millisekunden seit 1970), während now()
die Anzahl der Millisekunden seit Ihrer Seite der Navigation gestartet (so ist es viel kleiner als sein 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 .
Eine weitere Option zum Messen der Ausführungszeit in freier Wildbahn ist UserTiming . UserTiming verhält sich ähnlich wie console.time()
und console.timeEnd()
, verwendet jedoch denselben hochauflösenden Zeitstempel wie Sie now()
(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 an measure(measurename, startMarkname)
. Die Dauer wird dann in der PerformanceTimeline neben Ihren Markierungen 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. Es gibt auch eine Polyfüllung (die ich geschrieben habe).