Является ли System.currentTimeMillis() лучшим показателем производительности времени в Java? Есть ли какая-либо информация, когда вы используете это, чтобы сравнить время до того, как действие будет предпринято до момента принятия решения? Есть ли лучшая альтернатива?
Является ли System.currentTimeMillis() лучшим показателем производительности времени в Java?
Ответ 1
Надеюсь, что нет - это то, что я использую, когда я не использую nanoTime()
.
Ответ 2
Помимо System.nanoTime()
, JMX, вероятно, является наилучшим вариантом:
java.lang.management.ManagementFactory.getThreadMXBean()
вы можете запросить текущее время процессора (измеренное в секундах nano, но не с точностью до nano секунд, как для System.nanoTime
())
Ответ 3
Взгляните на это:
Ответ 4
Если вам нужны монотонные измерения времени, System.nanoTime - лучший выбор. System.currentTimeMillis подвержен изменениям времени UTC - скачкам, обновлениям NTP и джиттеру, а также пользователям, устанавливающим системные часы *. Это может вызвать некоторые впечатляющие сбои в определенных типах приложений времени. System.nanoTime, как предполагается, невосприимчив ко всему этому.
Проблемы с System.nanoTime включают периодическое числовое переполнение и долговременную неточность времени, что делает System.currentTimeMillis лучше для более длительных периодов времени (при условии, что пользователи оставляют системные часы в одиночку). Обратите внимание, что переход на летнее время и часовой пояс не должен влиять на System.currentTimeMillis.
* Windows "Синхронизация с интернетом" делает поэтапные изменения. Это может быть очень разрушительным, в отличие от надлежащей реализации клиента NTP, которая "преследует" сервер, корректируя частоту клиентской базы.
Ответ 5
Вы можете использовать "Секундомер" из Google Guava, что делает измерение времени очень легким.
Ответ 6
До Java 1.5 был только System.currentTimeMillis. Однако степень детализации зависит от базовой операционной системы и может быть большой. В Windows XP я иногда получал пробелы в 20 мс. Я слышал, что Linux намного лучше с пробелами в диапазоне 1-2 мс.
С помощью Java 1.5 вы также можете использовать System.nanoTime. У меня никогда не было проблем с этим.
Ответ 7
Один из способов заключается в том, что это измеряет время в реальном времени, а не время процессора, поэтому оно очень зависит от загрузки системы. Это нормально, если вы на свободной машине, но иногда можете получать интересные результаты, если другие процессы пытаются работать.
В этой статье есть интересное решение проблемы.