Как я могу измерить время с точностью микросекунды в Java?

Почему бы просто:

const products = this.state.test.products

без деструктурирования или двухуровневой деструктуризации и все такое?

21
задан Hearen 23 March 2019 в 07:25
поделиться

8 ответов

System.nanoTime() использует счетчик в ЦП и обычно с точностью до приблизительно 1 микросекунды на Windows XP и Linux.

Примечание: Windows XP часто менее точен на машинах мульти-CPU, поскольку он не компенсирует различные центральные процессоры, имеющие различные счетчики. Linux делает. Примечание 2: Это будет дрейфовать относительно System.currentTimeMillis (), поскольку это основано на точности часов для Вашего ЦП (который не должен быть настолько точным в течение времени), а не часы, которые Вы имеете для получения времени. (который дрейфует меньше в день, но имеет меньше гранулярности),

В Вашем сравнительном тесте Вы в основном тестируете скорость, на которой можно создать новые объекты. Не удивительно Ваши результаты будут варьироваться существенно на основе Ваших настроек GC и как недавно GC был выполнен.

Попытайтесь запустить свои тесты со следующими опциями, и необходимо видеть совсем другие результаты.

-verbosegc -XX:NewSize=128m -mx256m
4
ответ дан 29 November 2019 в 06:20
поделиться

Мое предположение то, что с тех пор System.nanoTime() использует "самый точный доступный системный таймер", который по-видимому только имеет точность миллисекунды в Вашей системе, Вы ничего не можете получить лучше.

31
ответ дан 29 November 2019 в 06:20
поделиться

Мне точно не ясно, чего Вы сравниваете, но в целом, любой тест, который занимает такой короткий срок для выполнения, та точность ниже, чем 50 мс релевантны, будет очень подверженным другим беспорядкам.

Я обычно пытаюсь сделать сравнительные тесты выполненными в течение по крайней мере 10 секунд. Платформа, которую я пишу в данный момент, предположит, сколько повторений для выполнения так, чтобы потребовалось 30 секунд. Это означает, что Вы не получите радикально различные результаты просто, потому что некоторый другой процесс украл ЦП для нескольких миллисекунд.

Выполнение для дольше является почти всегда лучшим подходом, чем попытка иметь размеры с точностью с более прекрасными зернами.

25
ответ дан 29 November 2019 в 06:20
поделиться

Необходимо повторить тесты тысячи времен. Существует много вещей, происходящих, который будет влиять на Ваши измерения, как сборка "мусора", ввод-вывод, подкачка в/, размер потоков готовой очереди, и т.д.

3
ответ дан 29 November 2019 в 06:20
поделиться

Это странно. System.nanoTime (), как предполагается, работает. Вы используете JVM Sun?

Можно ли просто повторить операцию 1000 раз и разделить ли время на 1 000 для обнаружения то, что необходимо знать?

3
ответ дан 29 November 2019 в 06:20
поделиться

Если Вы хотите надежный результат, используйте профилировщика. Я предлагаю VisualVM, который легко установить и связывается JDK, начинающим с версии 1.6.0_07.

Это - простой в использовании визуальный инструмент, который интегрирует несколько инструментов JDK командной строки и легких профильных возможностей.

3
ответ дан 29 November 2019 в 06:20
поделиться

Такой сравнительный тест, который полагается на короткий временной интервал, дает Вам ненадежные результаты. Вы будете всегда получать различные результаты, из-за внешних факторов как ввод-вывод, Свопинг, Переключатели Процесса, Кэши, Сборка "мусора" и т.д. Дополнительно JVM оптимизирует Ваши вызовы, таким образом, вероятно, что первые измеренные дела идут медленнее, чем более поздний вызов. JVM начинает все больше оптимизировать команды, которые Вы выполняете.

Дополнительно метод как System.nanoTime () зависит от таймеров базовой системы. Они могут (и скорее всего будет) не иметь гранулярности для измерения в той точности. Процитировать API:

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

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

Для создания сравнительного теста более стабильным, необходимо выполнить его несколько раз и измерить большие временные интервалы, чем только миллисекунды.

0
ответ дан 29 November 2019 в 06:20
поделиться

Может иметь место, что базовая ОС не предоставляет таймерам точность наносекунды.

Существует также более старое сообщение.

1
ответ дан 29 November 2019 в 06:20
поделиться
Другие вопросы по тегам:

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