Potrzebuję uzyskać czas wykonania w milisekundach.
Pierwotnie zadałem to pytanie w 2008 r. Przyjęta odpowiedź polegała na użyciu nowej funkcji Date (). GetTime () Jednak wszyscy możemy teraz zgodzić się, że użycie standardowego interfejsu API performance.now () jest bardziej odpowiednie. Dlatego zmieniam przyjętą odpowiedź na to pytanie.
javascript
profiling
Julius A.
źródło
źródło
Date
sposób, który daje cims
i wystarcza w większości przypadków. Myślę, że albertech.blogspot.com/2015/07/ ... ... ale tak, naprawdę powinieneś na to spojrzećPerformance.now
performance.now()
nie działa w węźle.new Date().getTime()
będzie działać w węźle.Odpowiedzi:
Za pomocą performance.now () :
Za pomocą konsoli. Czas :
(niestandardowy)( standard życia )Uwaga :
Ciąg znaków przekazywany dometod
time()
itimeEnd()
musi być zgodny(aby licznik czasu zakończył się zgodnie z oczekiwaniami).
źródło
użyj nowej Date (). getTime ()
dawny.
źródło
window.performance.now
. Patrz stackoverflow.com/a/15641427/632951Nie używaj Date (). Czytaj poniżej.
Użyj
performance.now()
:Działa na:
IE 10 ++
FireFox 15 ++
Chrome 24 ++
Safari 8 ++
Opera 15 ++
Android 4.4 ++
itd itd
console.time
może być dla Ciebie opłacalny , ale jest to niestandardowe § :Oprócz obsługi przeglądarki
performance.now
wydaje się, że może ona zapewniać dokładniejsze czasy, ponieważ wydaje się, że jest to wersja gołe kościconsole.time
.<rant> Ponadto, NIGDY nie używaj
Date
do niczego, ponieważ wpływają na to zmiany „czasu systemowego”. Co oznacza, że będzie się nieprawidłowe wyniki -jak „negatywnej czasu” - gdy użytkownik nie posiada dokładny czas systemowy:(Ustaw zegar systemowy na rok temu i przejdź do Gmaila, abyśmy wszyscy mogli się dobrze pośmiać. Być może pewnego dnia będziemy mieli Salę Wstydu dla JS
Date
.)now()
Problem dotyczy także funkcji arkusza kalkulacyjnego Google .Używasz
Date
tylko wtedy, gdy chcesz pokazać użytkownikowi jego czas systemowy. Nie wtedy, gdy chcesz uzyskać na czas lub do środka niczym.źródło
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()
iconsole.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:
Alternatywnie na komputerze programistycznym możesz dodać oprzyrządowanie do kodu za pomocą
console.time()
iconsole.timeEnd()
. Funkcje te, obsługiwane w Firefox11 +, Chrome2 + i IE11 +, raportują liczniki czasu, za pomocą których uruchamiasz / zatrzymujeszconsole.time()
.time()
przyjmuje jako argument nazwę zdefiniowanego przez użytkownika timera, atimeEnd()
następnie raportuje czas wykonania od uruchomienia timera: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ść parametrutimeEnd()
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()
: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ż tradycyjnyDate.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órenew Date().getTime()
,+ new Date
andtDate.now()
znajdują. Wyjątkiem jest to, żeDate
inow()
czasy nie mieszać, aDate
opiera się na Unix epoki (liczba milisekund od 1970 roku), podczas gdynow()
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()
: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()
iconsole.timeEnd()
, ale wykorzystuje ten sam znacznik czasu wysokiej rozdzielczości, z któregonow()
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.Funkcja UserTiming jest dostępna w IE10 + i Chrome25 +. Dostępna jest również polifill (którą napisałem).
źródło
performance.now
Date
Aby uzyskać dokładne wartości, należy użyć interfejsu Performance . Jest obsługiwany w nowoczesnych wersjach Firefox, Chrome, Opera i IE. Oto przykład, w jaki sposób można go użyć:
Date.getTime()
lubconsole.time()
nie są dobre do pomiaru dokładnego czasu wykonania. Możesz ich użyć, jeśli szybka wstępna ocena jest dla Ciebie odpowiednia. Z grubsza wynika, że można uzyskać przesunięcie o 15–60 ms w czasie rzeczywistym.Sprawdź ten genialny post na temat pomiaru czasu wykonania w JavaScript. Autor podaje również kilka linków na temat dokładności czasu JavaScript, które warto przeczytać.
źródło
Użyj Firebug, włącz konsolę i Javascript. Kliknij Profil. Przeładować. Kliknij ponownie Profil. Zobacz raport.
źródło
console.time()
iconsole.timeEnd()
teraz.Reper
Wynik
performance.now () jest opcjonalny - po prostu przekaż false do funkcji konstruktora StopWatch.
źródło
Process.hrtime () jest dostępny w Node.js - zwraca wartość w nanosekundach
źródło
hrtime[0] * 1000 + hrtime[1] / 1000000
-> tak, ja też wolę użyćvar hrtime
! : Pmożesz użyć operatora dodawania również tutaj
źródło
Aby rozszerzyć kod vsync, aby mieć możliwość zwrócenia timeEnd jako wartości w NodeJS, użyj tego małego fragmentu kodu.
Teraz użyj kodu w następujący sposób:
Daje to więcej możliwości. Możesz zapisać czas wykonania, aby wykorzystać go do innych celów, takich jak użycie go w równaniach lub w bazie danych, wysłany do zdalnego klienta przez gniazda sieciowe, obsługiwany na stronie internetowej itp.
źródło
Możliwe jest użycie tylko jednej zmiennej:
timer/1000
- konwertować milisekundy na sekundy.toFixed(5)
- przycinać dodatkowe cyfryźródło
Ponieważ
console.time
iperformance.now
nie są obsługiwane w niektórych głównych przeglądarkach (np. IE10), stworzyłem cienkie narzędzie, które wykorzystuje najlepsze dostępne metody. Brakuje jednak obsługi błędów w przypadku fałszywych zastosowań (wywoływanieEnd()
nie zainicjowanego timera).Użyj go i ulepsz go, jak chcesz.
źródło
To może ci pomóc.
var t0 = date.now(); doSomething(); var t1 = date.now(); console.log("Call to doSomething took approximate" + (t1 - t0)/1000 + " seconds.")
źródło
Oto dekorator dla funkcji pomiaru czasu
Stosowanie:
Jeśli używasz funkcji asynchronicznych, możesz dokonać
timed
asynchronizacji i dodaćawait
przed f (... args), i to powinno działać dla nich. Staje się to bardziej skomplikowane, jeśli chcesz, aby jeden dekorator obsługiwał zarówno funkcje synchronizacji, jak i asynchronizacji.źródło
Dzięki, Achim Koellner, nieco poszerzę twoją odpowiedź:
Pamiętaj, że nie powinieneś robić nic poza tym, co chcesz zmierzyć (na przykład
console.log
wykonanie będzie miało czas i wpłynie na testy wydajności).Należy zauważyć, że aby zmierzyć czas wykonania funkcji asynchronicznych, należy wstawić
var timeInMilliseconds = process.hrtime(t0)[1]/1000000;
wewnątrz wywołania zwrotnego. Na przykład,źródło
Kilka miesięcy temu stworzyłem własną procedurę, która mierzy funkcję przy użyciu Date.now () - mimo że w tamtym czasie akceptowaną metodą wydawała się performance.now () - ponieważ obiekt wydajności nie jest jeszcze dostępny (zbudowany -in) w stabilnej wersji Node.js.
Dzisiaj robiłem więcej badań i znalazłem inną metodę pomiaru czasu. Ponieważ znalazłem również sposób korzystania z tego w kodzie Node.js, pomyślałem, że podzielę się nim tutaj.
Poniższe przykłady połączono z przykładami podanymi przez w3c i Node.js :
UWAGA:
Jeśli zamierzasz używać
performance
obiektu w aplikacji Node.js, musisz uwzględnić następujące wymagania:const { performance } = require('perf_hooks')
źródło
performance.mark('end')
w tym przypadkuistnieje wiele sposobów osiągnięcia tego celu:
using console.time
jest to najbardziej efektywny sposób: użycie performance.now () , np
użyj + (dodaj operator) lub getTime ()
Oto, co się stanie, gdy zastosujesz jednoargumentowy operator plus do instancji Date: Uzyskaj wartość danej instancji Date Konwertuj ją na liczbę
UWAGA:
getTime()
daje lepszą wydajność niż operator jednoargumentowy.źródło
InitTime związane z
string
.return Singleton.getInstance().initTime(label); // Returns the time init
return Singleton.getInstance().endTime(label); // Returns the total time between init and end
źródło
Jeśli chcesz zmierzyć czas między wieloma zagnieżdżonymi rzeczami, możesz użyć tego:
Podobne do console.time (), ale łatwiejsze w użyciu, jeśli nie musisz śledzić poprzednich timerów.
Jeśli podoba ci się niebieski kolor z console.time (), możesz zamiast tego użyć tej linii
źródło
W moim przypadku korzystam z @ gramatyki suger i kompiluję go z babelem.
Problemem tej metody jest to, że funkcja musi znajdować się wewnątrz obiektu.
Przykładowy kod JS
.babelrc (dla babel 6)
źródło
Stoper z łącznymi cyklami
Współpracuje z serwerem i klientem (Node lub DOM), używa
Performance
interfejsu API. Dobrze, gdy masz wiele małych cykli, np. W funkcji o nazwie 1000 razy, która przetwarza 1000 obiektów danych, ale chcesz zobaczyć, jak każda operacja w tej funkcji stanowi sumę.Tak więc ten wykorzystuje moduł globalnego timera (singleton). Taki sam jak wzorzec singletonu klasy, nieco prostszy w użyciu, ale musisz umieścić go w osobnym
stopwatch.js
pliku np .źródło
Najlepszym sposobem byłoby użycie
performance hooks
modułu. Chociaż niestabilna, możnamark
konkretne obszary kodu i między zaznaczonych obszarach.measure
duration
Wypróbuj tutaj
źródło
źródło
Z wydajnością
NodeJs: Wymagane jest zaimportowanie klasy wydajności
Korzystanie z console.time
źródło
console.time("myTimer");
console.timeLog("myTimer");
console.timeEnd("myTimer");
Możesz przeczytać więcej na ten temat na MDN oraz w dokumentacji node.js .
Dostępne w Chrome, Firefox, Opera i NodeJS. (nie w Edge ani Internet Explorer).
źródło
Jak wspomniano wcześniej, sprawdź i użyj wbudowanego timera. Ale jeśli chcesz lub musisz napisać tutaj, moje dwa centy:
Kompilacja zakończyła się sukcesem!
źródło
Przyjęta odpowiedź jest błędna !
Ponieważ JavaScript jest asynchroniczny, wartości końca zmiennej przyjętej odpowiedzi byłyby błędne.
Wykonanie for może być bardzo szybkie, więc nie widać, że wynik jest nieprawidłowy. Możesz to przetestować za pomocą kodu wykonującego jakieś żądanie:
Tak więc alert wyświetli się bardzo szybko, ale w konsoli zobaczysz, że żądania ajax są kontynuowane.
Oto, jak powinieneś to zrobić: https://developer.mozilla.org/en-US/docs/Web/API/Performance.now
źródło