Является ли System.currentTimeMillis() лучшим показателем временной производительности в Java?
-
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.У меня никогда не было проблем с этим.
Одна из проблем заключается в том, что это измеряет прошедшее реальное время, а не процессорное, поэтому оно очень зависит от загрузки системы.Это нормально, если вы используете в остальном бесплатную машину, но иногда может привести к интересным результатам, если другие процессы пытаются выполнить свою работу.
Эта статья есть интересное решение этой проблемы.