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