2012-01-22 11 views
6

Dostałem ciekawą "podróży w czasie" problem dzisiaj, korzystając z następującego kodu:śledzenia w Javie Czas: używając currentTimeMills()

for (int i = 0; i < 1; i++){ 
    long start = System.currentTimeMillis(); 
    // Some code here 
    System.out.print(i + "\t" + (System.currentTimeMillis() - start)); 
    start = System.currentTimeMillis(); 
    // Some code here 
    System.out.println("\t" + (System.currentTimeMillis() - start)); 
} 

I mam wynik

0 15 -606 

I wydaje się, że nie jest to powtarzalne. Czy ktoś ma jakieś wskazówki na temat tego, co wydarzyło się w środku podczas biegu? Po prostu ciekawy ...

Nowa edycja: Użyłem małego testu, aby potwierdzić odpowiedzi poniżej. I uruchomić program i zmienić czas systemowy podczas biegu, a wreszcie powtórzyć „podróży w czasie”:

0 -3563323 163 

Sprawa zamknięta. Dzięki chłopaki!

Więcej słów: zarówno currentTimeMillis(), jak i nanoTime() są oparte na czasomierzu, więc nie będą monotoniczne, jeśli zegar systemowy zostanie zaktualizowany (w odwrotnej kolejności). W takich przypadkach lepiej jest korzystać z niektórych zegarów internetowych.

+0

Nie jestem pewien, czy 'currentTimeMillis' jest monotoniczne. Możesz mieć lepsze wyniki z 'System.nanoTime()', który jest zaprojektowany specjalnie do mierzenia odstępach czasu. – Rom1

+0

@ asksw0rder: czy możesz ponownie uruchomić ten sam program i zaktualizować drugie wyjście? –

+0

@ asksw0rder Jaka jest zmienna i? Jaka jest wartość? Nie ma sensu, aby uzyskać 0 na pierwszym wyjściu. – sfrj

Odpowiedz

11

System.currentTimeMillis() zależy od czasu systemowego. Więc może być modyfikowany przez systemy stron trzecich.

Dla czasu pomiaru jest to System.nanoTime() lepsza opcja.

+0

+1 za wzmianka o lepszej alternatywie – sfrj

+0

nanoTime() to nie jest też w porządku dla takiego przypadku. Lepiej jest korzystać z czasu internetowego. – asksw0rder

+0

Nie powiedziałem, że jest to najlepsza opcja, tylko lepsza niż 'System.currentTimeMillis()'! Trudno jest zmierzyć nano sekund przez internet. – Robin

0

Przypominam sobie, że czasem wprowadzono korekty czasu w systemach czasowych. A ponieważ currentTimeMillis opiera się na zegarze systemowym, który mógł się stać. Synchronizujesz się również z serwerem czasu, który może być również.

Powiązane problemy