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