Подтвердить что ты не робот

System.currenTimeInMillis() vs System.nanoTime()

Я знаю, что System.nanoTime() теперь является предпочтительным методом измерения времени по System.currentTimeInMillis(). Первая очевидная причина - nanoTime() дает более точное время и другую причину, по которой я читаю, что на последнее влияют корректировки системных часов реального времени. Что означает "получить влияние на системы в режиме реального времени"?

4b9b3361

Ответ 1

В этом случае я нашел следующий отрывок из блога:

Если вас интересует измерение абсолютного времени, тогда всегда используйте System.currentTimeMillis(). Имейте в виду, что его разрешение может быть вполне грубый (хотя это редко бывает проблемой для абсолютных времен.)

Если вас интересует измерение/расчет прошедшего времени, тогда всегда используйте System.nanoTime(). В большинстве систем это даст разрешение порядка микросекунд. Имейте в виду, однако, этот вызов также может принимать микросекунды для выполнения на некоторых платформах.

Часы и таймеры - Общий обзор Дэвида Холмса

Так как System.currentTimeMillis() полагается на системное время дневных часов, корректировки времени являются законными, чтобы сохранить его вовремя.

Что означает корректировки здесь? Возьмем, к примеру, описание CLOCK_REALTIME из Linux:

Общесистемные часы, которые измеряют реальные (то есть часы настенных часов).               Для установки этих часов требуются соответствующие привилегии. Эти часы                , подверженные прерывистым скачкам в системном времени (например, , если               системный администратор вручную меняет часы), а               инкрементные корректировки, выполняемые приложением (3) и NTP.

Ответ 2

Просто проверьте JavaDoc методов:

System.nanoTime()

"... Этот метод можно использовать только для измерения прошедшего времени и не имеет отношения ни к какому-либо другому понятию системного или настенного времени..."

System.currentTimeMillis()

"... Возвращает текущее время в миллисекундах...."

Итак, как вы можете видеть, изменяется ли системное время во время измерения с помощью System.currentTimeMillis(), интервал, который вы измеряете, тоже изменится. Однако при измерении интервала с использованием метода System.nanoTime() он не изменится.

Ответ 3

Это означает, что значение, возвращаемое System.currentTimeMillis(), получается из внутренних часов машины. Если sysadmin (или NTP) изменяет время, например, если установлено, что часы работают на 5 минут быстрее, а системный администратор отправляется и исправляет его, это повлияет на System.currentTimeMillis(). Это означает, что вы даже можете увидеть уменьшение значения, и если вы используете его для измерения интервалов, тайминги могут быть отключены. Вы можете даже измерить отрицательные тайминги.

System.nanoTime(), с другой стороны, возвращает значение, полученное из некоторого внутреннего счетчика/часов процессора. Время, измеренное этими часами, не может быть изменено никаким пользователем или программой. Это означает, что он будет более надежным для синхронизации. Но тактовая частота процессора reset при отключении питания, поэтому она не полезна для нахождения текущего времени "настенных часов".