Jeśli potrzebujesz uzyskać czas wykonania funkcji na lokalnym komputerze programistycznym , możesz użyć narzędzi profilujących przeglądarki lub poleceń konsoli, takich jak console.time()
i console.timeEnd()
.
Wszystkie nowoczesne przeglądarki mają wbudowane profile JavaScript. Profile te powinny dać najdokładniejszy pomiar, ponieważ nie trzeba modyfikować istniejącego kodu, co może wpłynąć na czas wykonywania funkcji.
Aby profilować JavaScript:
- W Chrome naciśnij klawisz F12 i wybierz kartę Profile , a następnie Zbierz profil procesora JavaScript .
- W przeglądarce Firefox zainstaluj / otwórz Firebug i kliknij przycisk Profil .
- W przeglądarce IE 9+ naciśnij klawisz F12 , kliknij Skrypt lub Profiler (w zależności od wersji IE).
Alternatywnie na komputerze programistycznym możesz dodać oprzyrządowanie do kodu za pomocą console.time()
i console.timeEnd()
. Funkcje te, obsługiwane w Firefox11 +, Chrome2 + i IE11 +, raportują liczniki czasu, za pomocą których uruchamiasz / zatrzymujesz console.time()
. time()
przyjmuje jako argument nazwę zdefiniowanego przez użytkownika timera, a timeEnd()
następnie raportuje czas wykonania od uruchomienia timera:
function a() {
console.time("mytimer");
... do stuff ...
var dur = console.timeEnd("myTimer"); // NOTE: dur only works in FF
}
Pamiętaj, że tylko Firefox zwraca upływ czasu timeEnd()
połączenia. Inne przeglądarki po prostu zgłaszają wynik do konsoli programisty: zwracana wartość parametru timeEnd()
jest niezdefiniowana.
Jeśli chcesz uzyskać czas wykonywania funkcji na wolności , musisz instrumentować swój kod. Masz kilka opcji. Możesz po prostu zapisać czas rozpoczęcia i zakończenia, wysyłając zapytanie new Date().getTime()
:
function a() {
var start = new Date().getTime();
... do stuff ...
var end = new Date().getTime();
var dur = end - start;
}
Jednak Date
obiekt ma rozdzielczość tylko milisekundową i będą podlegały zmianom zegara systemowego dowolnego systemu operacyjnego. W nowoczesnych przeglądarkach jest lepsza opcja.
Lepszą opcją jest użycie czasu wysokiej rozdzielczości , alias window.performance.now()
. now()
jest lepszy niż tradycyjny Date.getTime()
na dwa ważne sposoby:
now()
jest podwójną z rozdzielczością submilisekundową, która reprezentuje liczbę milisekund od początku nawigacji strony. Zwraca liczbę mikrosekund w ułamku (np. Wartość 1000,123 to 1 sekunda i 123 mikrosekundy).
now()
rośnie monotonicznie. Jest to ważne, ponieważ Date.getTime()
może ewentualnie skoczyć do przodu lub do tyłu nawet na kolejnych połączeń. W szczególności, jeśli czas systemowy systemu operacyjnego zostanie zaktualizowany (np. Synchronizacja zegara atomowego), Date.getTime()
również zostanie zaktualizowany. now()
gwarantuje, że zawsze będzie monotonicznie wzrastać, więc czas systemowy systemu operacyjnego nie ma na niego wpływu - zawsze będzie to zegar ścienny (zakładając, że zegar ścienny nie jest atomowy ...).
now()
mogą być stosowane w niemal każdym miejscu, które new Date().getTime()
, + new Date
andt Date.now()
znajdują. Wyjątkiem jest to, że Date
i now()
czasy nie mieszać, a Date
opiera się na Unix epoki (liczba milisekund od 1970 roku), podczas gdy now()
jest to liczba milisekund od rozpoczęła swoją nawigację strony (tak, to będzie dużo mniejszy niż Date
).
Oto przykład użycia now()
:
function a() {
var start = window.performance.now();
... do stuff ...
var end = window.performance.now();
var dur = end - start;
}
now()
jest obsługiwany w przeglądarce Chrome stabilnej, Firefox 15+ i IE10. Dostępnych jest również kilka wypełniaczy .
Inną opcją pomiaru czasu wykonania na wolności jest UserTiming . Funkcja UserTiming zachowuje się podobnie do console.time()
i console.timeEnd()
, ale wykorzystuje ten sam znacznik czasu wysokiej rozdzielczości, z którego now()
korzysta (dzięki czemu otrzymujesz monotonicznie rosnący zegar poniżej jednej milisekundy), a także zapisuje znaczniki czasu i czas trwania w PerformanceTimeline .
UserTiming ma pojęcia znaków (znaczników czasu) i miar (czasów trwania). Możesz zdefiniować dowolną ich liczbę, a będą one widoczne w PerformanceTimeline .
Aby zapisać znacznik czasu, dzwonisz mark(startMarkName)
. Aby uzyskać czas od pierwszego znaku, wystarczy zadzwonić measure(measurename, startMarkname)
. Czas trwania jest następnie zapisywany w PerformanceTimeline obok twoich ocen.
function a() {
window.performance.mark("start");
... do stuff ...
window.performance.measure("myfunctionduration", "start");
}
// duration is window.performance.getEntriesByName("myfunctionduration", "measure")[0];
Funkcja UserTiming jest dostępna w IE10 + i Chrome25 +. Dostępna jest również polifill (którą napisałem).