Отслеживание времени в Java: использование currentTimeMills () - PullRequest
7 голосов
/ 22 января 2012

Сегодня у меня возникла интересная проблема «путешествия во времени», используя следующий код:

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));
}

И я получил результат

0   15  -606

И кажется, что это не повторяется. У кого-нибудь есть какие-либо подсказки о том, что произошло внутри во время бега? Просто любопытно ...

Новое редактирование: я использовал небольшой тест для подтверждения ответов ниже. Я запускаю программу и изменяю системное время во время запуска, и, наконец, повторяю «путешествие во времени»:

0   -3563323    163

Дело закрыто. Спасибо, ребята!

Больше слов: currentTimeMillis () и nanoTime () основаны на системном таймере, поэтому они не будут монотонными, если системный таймер обновлен (в частности, повернут назад). Для таких случаев лучше использовать интернет-таймер.

Ответы [ 2 ]

12 голосов
/ 22 января 2012

System.currentTimeMillis() зависит от системного времени. Так что это может быть изменено сторонними системами.

Для измерения времени System.nanoTime() лучший вариант.

0 голосов
/ 22 января 2012

Я вспоминаю что-то вроде корректировки времени, которые время от времени вносились в системное время, чтобы соответствовать реальному времени. А так как currentTimeMillis полагается на системные часы, которые могли бы произойти. Также вы синхронизируете с сервером времени, который также может быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...