2009-08-07 15 views
6

Czasu mam kilka rzeczy, których nie mogę po prostu umieścić w długiej pętli. I potrzebuję czasu, aby je zobaczyć, ile czasu zajmie, aby zakończyć, ale wydaje się, że timer ma dokładność 15-16 ms w java? Jak mogę to obejść?Dokładność taktowania w java

Odpowiedz

8

Czy próbowałeś używać System.nanoTime()?

Z Javadoc:

Zwraca bieżącą wartość najdokładniejszym zegarem systemowym dostępnych w nanosekund.

Ta metoda może być używana tylko do mierzenia czasu, który upłynął i nie jest związana z żadnym innym pojęciem czasu systemowego ani zegara ściennego. Zwrócona wartość reprezentuje nanosekundy od pewnego ustalonego, ale arbitralnego czasu (być może w przyszłości, więc wartości mogą być ujemne). Ta metoda zapewnia nanosekundową dokładność, ale niekoniecznie dokładność rzędu nanosekund. Nie ma gwarancji, jak często zmieniają się wartości. Różnice w kolejnych połączeniach, które trwają dłużej niż około 292 lata (2 nanosekund), nie dokładnie obliczy czas, który upłynął z powodu przekroczenia wartości liczbowej.

Na przykład, aby zmierzyć, jak długo trwa jakiś kod do wykonania:

długiej startTime = System.nanoTime(); // ... mierzony kod ... long estimatedTime = System.nanoTime() - startTime;

+6

heh, ja Uwielbiam to zdanie: "Różnice w kolejnych połączeniach, które trwają dłużej niż około 292 lata (263 nanosekundy), nie dokładnie obliczyć upływający czas z powodu przepełnienia liczbowego." Powinien istnieć konkurs na najdłużej działający program bez przerwy/awarii. –

4

Clocks and Timers - General Overview

Java Programowanie API zegarów i liczniki Bezwzględna zegar "time-of-day" jest reprezentowana przez sposób System.currentTimeMillis() która zwraca milisekundę reprezentacja czasu na ścianie w milisekund od epoki. Jako taki wykorzystuje system operacyjny "czas dnia" zegar. Rozdzielczość aktualizacji tego zegara jest często taka sama, jak przerwanie timera (np. 10 ms), ale w przypadku niektóre systemy są stałe, niezależnie od współczynnika przerwania.

zegara względem czasu jest reprezentowana przez metodą System.nanoTime(), która zwraca „sypki” czas w nanosekund. Ten czas jest przydatny tylko dla porównania wartości innych nanoTime . Metoda nanoTime używa zegara o największej rozdzielczości dostępnej na platformie, a podczas gdy jego zwrotna wartość wynosi , rozdzielczość aktualizacji wynosi zwykle tylko mikrosekund. Jednak w niektórych systemach nie ma wyboru, ale do korzystania z tego samego źródła zegara jak currentTimeMillis() - na szczęście to jest rzadkie i dotyczy głównie starych systemów Linux i Windows 98.