Jest teraz nowa metoda pomiaru mikrosekund w javascript:
http://gent.ilcore.com/2012/06/better-timer-for-javascript.html
Jednak w przeszłości znalazłem prymitywną metodę uzyskiwania precyzji 0,1 milisekundy w JavaScript z milisekundowego timera. Niemożliwy? Nie. Czytaj dalej:
Przeprowadzam eksperymenty z wysoką precyzją, które wymagają samodzielnego sprawdzenia dokładności timera i stwierdziłem, że jestem w stanie niezawodnie uzyskać dokładność 0,1 milisekundy w niektórych przeglądarkach w niektórych systemach.
Zauważyłem, że w nowoczesnych przeglądarkach internetowych z akceleracją GPU w szybkich systemach (np. Czterordzeniowy i7, gdzie kilka rdzeni jest bezczynnych, tylko okno przeglądarki) - mogę teraz ufać, że liczniki czasu będą działały z dokładnością do milisekund. W rzeczywistości stało się to tak dokładne w bezczynnym systemie i7, że byłem w stanie niezawodnie uzyskać dokładnie tę samą milisekundę, ponad 1000 prób. Tylko wtedy, gdy próbuję załadować dodatkową stronę internetową lub inne, dokładność milisekund spada (I jestem w stanie z powodzeniem złapać własną obniżoną dokładność, wykonując kontrolę czasu przed i po, aby sprawdzić, czy mój czas przetwarzania nagle wydłużył się do 1 lub więcej milisekund - pomaga mi to unieważnić wyniki, na które prawdopodobnie zbyt niekorzystny wpływ miały wahania wydajności procesora).
Stało się tak dokładne w niektórych przeglądarkach z akceleracją GPU w czterordzeniowych systemach i7 (kiedy okno przeglądarki jest jedynym oknem), że chciałbym mieć dostęp do precyzyjnego timera 0,1 ms w JavaScript, ponieważ dokładność jest wreszcie teraz w niektórych zaawansowanych systemach przeglądania, aby taka precyzja timera była opłacalna w niektórych typach zastosowań niszowych, które wymagają wysokiej precyzji, i w których aplikacje są w stanie samodzielnie zweryfikować odchylenia dokładności.
Oczywiście, jeśli wykonujesz kilka przebiegów, możesz po prostu wykonać wiele przebiegów (np. 10 przebiegów), a następnie podzielić przez 10, aby uzyskać dokładność 0,1 milisekundy. Jest to powszechna metoda uzyskiwania lepszej precyzji - wykonaj wiele przebiegów i podziel całkowity czas przez liczbę przebiegów.
JEDNAK ... Jeśli mogę wykonać tylko jeden test porównawczy określonego testu z powodu niezwykle wyjątkowej sytuacji, dowiedziałem się, że mogę uzyskać dokładność 0,1 (a czasami 0,01 ms), wykonując następujące czynności:
Inicjalizacja / kalibracja:
- Uruchom zajętą pętlę, aby poczekać, aż licznik czasu zwiększy się do następnej milisekundy (wyrównaj licznik czasu do początku następnego interwału milisekundowego). Ta zajęta pętla trwa krócej niż milisekundę.
- Uruchom kolejną zajętą pętlę, aby zwiększyć licznik podczas oczekiwania na zwiększenie licznika czasu. Licznik informuje, ile przyrostów licznika wystąpiło w ciągu jednej milisekundy. Ta zajęta pętla trwa jedną pełną milisekundę.
- Powtarzaj powyższe, aż liczby staną się bardzo stabilne (czas ładowania, kompilator JIT itp.). 4. UWAGA: Stabilność numeru zapewnia osiągalną precyzję w systemie bezczynności. Możesz obliczyć wariancję, jeśli chcesz samodzielnie sprawdzić dokładność. Rozbieżności są większe w niektórych przeglądarkach i mniejsze w innych przeglądarkach. Większy na szybszych systemach i wolniejszy na wolniejszych systemach. Konsystencja też jest różna. Możesz stwierdzić, które przeglądarki są bardziej spójne / dokładne niż inne. Wolniejsze systemy i obciążone systemy będą prowadzić do większych rozbieżności między przebiegami inicjalizacji. Może to dać Ci możliwość wyświetlenia komunikatu ostrzegawczego, jeśli przeglądarka nie zapewnia wystarczającej precyzji, aby umożliwić pomiary 0,1 ms lub 0,01 ms. Pochylenie timera może stanowić problem, ale niektóre liczniki czasu w milisekundach w niektórych systemach zwiększają się dość dokładnie (całkiem dokładnie na kropce), co daje bardzo spójne wartości kalibracji, którym można ufać.
- Zapisz końcową wartość licznika (lub średnią z kilku ostatnich przejść kalibracji)
Test porównawczy jednego przebiegu do dokładności poniżej milisekundy:
- Uruchom zajętą pętlę, aby poczekać, aż licznik czasu zwiększy się do następnej milisekundy (wyrównaj licznik czasu do początku następnego interwału milisekundowego). Ta zajęta pętla trwa krócej niż milisekundę.
- Wykonaj zadanie, które chcesz dokładnie porównać z czasem.
- Sprawdź minutnik. To daje liczbę całkowitą w milisekundach.
- Uruchom ostatnią zajętą pętlę, aby zwiększyć licznik, czekając na przyrost czasu. Ta zajęta pętla trwa krócej niż milisekundę.
- Podzielić tę wartość licznika przez oryginalną wartość licznika z inicjalizacji.
- Teraz masz dziesiętną część milisekund !!!!!!!!
OSTRZEŻENIE: Zajęte pętle NIE są zalecane w przeglądarkach internetowych, ale na szczęście te zajęte pętle działają krócej niż 1 milisekunda każda i są uruchamiane tylko kilka razy.
Zmienne, takie jak kompilacja JIT i wahania procesora, dodają ogromne niedokładności, ale jeśli uruchomisz kilka przebiegów inicjalizacyjnych, będziesz mieć pełną dynamiczną rekompilację, a ostatecznie licznik ustali się na coś bardzo dokładnego. Upewnij się, że wszystkie zajęte pętle mają dokładnie tę samą funkcję we wszystkich przypadkach, aby różnice w zajętych pętlach nie prowadziły do różnic. Upewnij się, że wszystkie wiersze kodu są wykonywane kilka razy, zanim zaczniesz ufać wynikom, aby umożliwić kompilatorom JIT już ustabilizowanie do pełnej dynamicznej rekompilacji (dynarec).
W rzeczywistości byłem świadkiem zbliżania się precyzji do mikrosekund w niektórych systemach, ale jeszcze nie ufałbym temu. Ale dokładność 0,1 milisekundy wydaje się działać całkiem niezawodnie w bezczynnym czterordzeniowym systemie, w którym jestem jedyną stroną przeglądarki. Doszedłem do naukowego przypadku testowego, w którym mogłem wykonywać tylko jednorazowe przejścia (z powodu występujących unikalnych zmiennych) i musiałem precyzyjnie mierzyć czas każdego przebiegu, zamiast uśredniać wielokrotne powtórzenia, więc dlatego to zrobiłem.
Zrobiłem kilka przejść wstępnych i fałszywych (również w celu ustalenia dynamiki), aby zweryfikować niezawodność z dokładnością 0,1 ms (utrzymywałem się przez kilka sekund), potem trzymałem ręce z dala od klawiatury / myszy, podczas gdy wystąpił benchmark, a potem wykonałem kilka post-passy w celu zweryfikowania dokładności z dokładnością do 0,1 ms (ponownie pozostały stałe). To również weryfikuje, czy rzeczy takie jak zmiany stanu zasilania lub inne rzeczy nie wystąpiły między okresem przed i po, co wpływa na wyniki. Powtarzaj pre-test i post-test między każdym kolejnym przejściem benchmarku. W związku z tym byłem prawie pewien, że wyniki pomiędzy nimi były dokładne. Oczywiście nie ma gwarancji, ale pokazuje, że dokładność <0,1 ms jest możliwa w niektórych przypadkach w przeglądarce internetowej.
Ta metoda jest przydatna tylko w bardzo, bardzo niszowych przypadkach. Mimo to dosłownie nie będzie to w 100% w nieskończoność gwarantowane, możesz uzyskać bardzo wiarygodną dokładność, a nawet dokładność naukową w połączeniu z kilkoma warstwami weryfikacji wewnętrznych i zewnętrznych.