Советы по написанию микро-тестов от создателей Java HotSpot :
Правило 0: Прочтите авторитетную статью о JVM и микробенчмаркингах Хороший - Брайан Гетц, 2005 . Не ожидайте слишком многого от микро-тестов; они измеряют только ограниченный диапазон рабочих характеристик JVM.
Правило 1: Всегда включайте фазу прогрева, которая запускает ваше тестовое ядро на всем протяжении, достаточное для запуска всех инициализаций и компиляций до фазы (фаз) синхронизации. (Меньше итераций в порядке на этапе разогрева. Основное правило - несколько десятков тысяч итераций внутреннего цикла.)
Правило 2: Всегда запускайте с -XX:+PrintCompilation
, -verbose:gc
и т. Д., Чтобы вы могли убедиться, что компилятор и другие части JVM не выполняют неожиданную работу во время фазы синхронизации.
Правило 2.1: Печатайте сообщения в начале и в конце фаз хронирования и прогрева, чтобы можно было убедиться, что в фазе тактирования нет выходных данных из правила 2.
Правило 3: Имейте в виду разницу между -client
и -server
и OSR и регулярными компиляциями. Флаг -XX:+PrintCompilation
сообщает о компиляции OSR со знаком at, обозначающим не начальную точку входа, например: Trouble$1::run @ 2 (41 bytes)
. Предпочитайте сервер клиенту и обычное OSR, если вам нужна лучшая производительность.
Правило 4: Помните об эффектах инициализации. Не печатайте в первый раз во время фазы синхронизации, так как печать загружает и инициализирует классы. Не загружайте новые классы вне фазы прогрева (или финальной фазы отчетности), если только вы не тестируете загрузку классов специально (а в этом случае загружаете только тестовые классы). Правило 2 - ваша первая линия защиты от таких эффектов.
Правило 5: Имейте в виду эффекты деоптимизации и перекомпиляции. Не используйте какой-либо путь к коду в первый раз на этапе синхронизации, потому что компилятор может создать нежелательную и перекомпилировать код, основываясь на более раннем оптимистическом предположении, что этот путь вообще не будет использоваться. Правило 2 - ваша первая линия защиты от таких эффектов.
Правило 6: Используйте соответствующие инструменты, чтобы прочитать мысли компилятора и ожидать, что вы будете удивлены кодом, который он генерирует. Проверьте код самостоятельно, прежде чем создавать теории о том, что делает что-то быстрее или медленнее.
Правило 7: Уменьшите шум в ваших измерениях. Запустите свой тест на тихой машине и запустите его несколько раз, отбрасывая выбросы. Используйте -Xbatch
для сериализации компилятора с приложением и рассмотрите установку -XX:CICompilerCount=1
для предотвращения параллельной работы компилятора. Старайтесь изо всех сил уменьшить накладные расходы ГХ, установите Xmx
(достаточно большой) равным Xms
и используйте UseEpsilonGC
, если он доступен.
Правило 8: Используйте библиотеку для своего эталонного теста, поскольку она, вероятно, более эффективна и уже отлажена для этой единственной цели. Например, JMH , Caliper или Отличный тест UCSD Билла и Пола для Java .