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

17

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

хороший ответ здесьstackoverflow.com/a/9458267/741970 Dmitry Minkovsky

Ваш Ответ

7   ответов
-1

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

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

Проголосовал, потому что ссылочная ссылка больше не доступна. Пожалуйста, указывайте соответствующую информацию.
Ссылка не работает: /
1

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

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

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

0

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

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

1
2

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

java.lang.management.ManagementFactory.getThreadMXBean()

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

13

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

Одна ошибка (в Windows с Sun JDK6, в любом случае) сnanoTime является то, что возвращаемое значение зависит от ядра процессора, выполняющего поток. Если поток начнет выполняться на одном ядре и завершится на другом ядре, ваши цифры будут несколько отличаться. У меня был код какlong start = System.nanoTime(); doIt(); long elapsedNanos = System.nanoTime() - start; и завелсяelapsedNanos быть отрицательным
если между временем начала и окончания поток был приостановлен, то время окончания будет также отражать время приостановки. поэтому конечный запуск не будет фактическим временем, потраченным потоком на выполнение.
2

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

Похожие вопросы