Как долго нужно запускать микробиблиотеку?

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

Несколько лет назад кто-то (я думаю, Хайнц Кабуц?) отметил, что каждый бенчмарк, который стоит времени, чтобы посмотреть на его результаты, должен длиться как минимум несколько минут и должен быть запущен как минимум 3 раза, тогда как первый запуск всегда отбрасывается. Это должно было учитывать разминку JVM, а также несоответствия в среде (фоновые процессы, сетевой трафик и т.д.) И погрешности измерения. Это имело смысл для меня, и мой личный опыт подсказывал нечто подобное, поэтому я всегда принимал эту стратегию.

Тем не менее, я заметил много людей (например Jeff) пишут тесты, которые работают только на пару миллисекунд (!) и запускаются только один раз. Я знаю, что точность краткосрочных тестов выросла в последние годы, но она по-прежнему кажется мне странной. Должен ли не каждый микроцентрифуг работать как минимум на секунду и работать минимум 3 раза, чтобы получить несколько полезный результат? Или это правило устарело сейчас?

Ответ 1

По моему опыту вам нужно:

  • выполняется несколько раз (и отбрасывает первый результат - VM и другие эффекты)
  • возьмите минимальное время, если вы ищете вычислительный код
  • выполняется достаточно долго, чтобы снизить затраты на циклы и функции синхронизации.
  • идеально работает в пределах одного сегмента времени ОС (обычно 10 мс) или для более чем одного временного фрагмента, например. пробег ~ 5 мс или ~ 500 мс.

Я использую только интенсивный вычислительный код - если у вас есть другой профиль (например, интенсивный объем памяти или много ввода-вывода), тогда стратегия синхронизации может быть другой.