Является ли System.currentTimeMillis() лучшим показателем временной производительности в Java?

StackOverflow https://stackoverflow.com/questions/1073325

  •  21-08-2019
  •  | 
  •  

Вопрос

Является ли System.currentTimeMillis() лучшим показателем временной производительности в Java?Есть ли какие-либо ошибки при использовании этого для сравнения времени до выполнения действия со временем после выполнения действия?Есть ли лучшая альтернатива?

Это было полезно?

Решение

Надеюсь, что нет - это то, что я использую, когда не использую nanoTime().

Другие советы

кроме того System.nanoTime(), JMX , вероятно, является лучшим жизнеспособным вариантом:

java.lang.management.ManagementFactory.getThreadMXBean()

вы можете запросить процессорное время текущего потока (измеряется в наносекундах, но не с точностью до наносекунд, как для System.nanoTime())

Вы можете использовать Секундомер от Google Guava это делает измерение времени очень простым.

Если вам нужны монотонные измерения времени, System.nanoTime - лучший выбор.System.currentTimeMillis зависит от изменений времени по UTC - високосных секунд, обновлений NTP и дрожания, а также от настроек системных часов пользователями *.Это может привести к некоторым впечатляющим сбоям в определенных типах приложений синхронизации.Предполагается, что System.nanoTime невосприимчив ко всему этому.

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

* Windows "Синхронизация с интернет-временем" вносит пошаговые изменения.Это может быть очень разрушительным, в отличие от правильной реализации клиента NTP, которая "преследует" сервер, регулируя частоту клиентской временной базы.

До Java 1.5 существовал только System.currentTimeMillis.Однако степень детализации значения зависит от базовой операционной системы и может быть большой.В Windows XP у меня иногда возникали промежутки в 20 мс.Я слышал, что Linux намного лучше работает с промежутками в диапазоне 1-2 мс.

С Java 1.5 вы также можете использовать System.nanoTime.У меня никогда не было проблем с этим.

Одна из проблем заключается в том, что это измеряет прошедшее реальное время, а не процессорное, поэтому оно очень зависит от загрузки системы.Это нормально, если вы используете в остальном бесплатную машину, но иногда может привести к интересным результатам, если другие процессы пытаются выполнить свою работу.

Эта статья есть интересное решение этой проблемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top