Почему JMH запускает разные вилки?

Я использую базовую платформу JMH (http://openjdk.java.net/projects/code-tools/jmh/) для запуска тестов в моем коде. Я понимаю, что JMH несколько раз разворачивает JVM во время бенчмаркинга, чтобы отбросить любые профили, созданные с помощью профилирования JIT, выполняемого JVM во время выполнения.

Я понимаю, почему это полезно в некоторых случаях, таких как ниже (скопированный дословно из http://java-performance.info/jmh/):

По умолчанию JHM создает новый процесс java для каждого процесса (набор итераций). Это необходимо для защиты теста от ранее собранных "профилей" - информации о других загруженных классах и их информации об исполнении. Например, если у вас есть 2 класса, реализующих один и тот же интерфейс, и проверьте производительность обоих из них, то первая реализация (в порядке тестирования), вероятно, будет быстрее второй (в той же JVM), потому что JIT заменяет прямые вызовы метода для первой реализации с вызовами метода интерфейса после обнаружения второй реализации.

Однако в случае, когда вы сравниваете один и тот же код, есть ли какое-либо преимущество для запуска, скажем, 10 вилок из 20 итераций каждый вместо 1 вилки с 200 итерациями?

Большое спасибо,

Дэнни

Ответ 1

Некоторые люди настаивают на том, что другая проблема, решаемая с помощью forks, - это переменная run-to-run: http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_13_RunToRun.java

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