Советы о написании микро контрольных показателей from the creators of Java HotSpot:
Правило 0: Читать уважаемую газету на виртуальных машинах и микро-бенчмаркинга. Хороший - Brian Goetz, 2005. Не ожидайте слишком многого из микро-тестов; они измеряют только ограниченный диапазон рабочих характеристик JVM.
Правило 1: Всегда включайте фазу прогрева, которая запускает тестовое ядро на всем протяжении, достаточное для запуска всех инициализаций и компиляций перед фазой фазы. (Меньшее количество итераций в порядке на этапе прогрева Эмпирическое правило составляет несколько десятков тысяч итераций внутреннего цикла.).
Правило 2: Всегда работать с -XX:+PrintCompilation
, -verbose:gc
и т.д., так что вы можете проверить, что компилятор и другие части JVM не делают неожиданной работы во время фазы синхронизации.
Правило 2.1: Печатать сообщения в начале и конце фаз таймера и прогрева, чтобы вы могли убедиться, что на этапе синхронизации нет выхода из правила 2.
Правило 3: Знайте разницу между -клиентом и-сервером, а также OSR и регулярными компиляциями. Флаг -XX:+PrintCompilation
сообщает компиляции OSR с знаком at, чтобы обозначить не начальную точку входа, например: Trouble$1::run @ 2 (41 bytes)
. Предпочитайте сервер для клиента и регулярно подключайтесь к OSR, если вы добились наилучшей производительности.
Правило 4: Помните об эффектах инициализации. Не печатайте в первый раз во время фазы синхронизации, так как печать загружает и инициализирует классы. Не загружайте новые классы за пределы фазы прогрева (или фазы окончательной отчетности), если вы специально не тестируете загрузку классов (и в этом случае загружаете только классы тестов). Правило 2 - это ваша первая линия защиты от таких эффектов.
Правило 5: Знайте об эффектах деоптимизации и перекомпиляции. Не принимайте какой-либо кодовый путь в первый раз на фазе синхронизации, потому что компилятор может мусор и перекомпилировать код на основе более раннего оптимистического предположения о том, что путь не будет использоваться вообще. Правило 2 - это ваша первая линия защиты от таких эффектов.
Правило 6: Используйте соответствующие инструменты, чтобы читать мысли компилятора, и ожидайте удивления от кода, который он производит. Осмотрите код самостоятельно, прежде чем создавать теории о том, что делает что-то быстрее или медленнее.
Правило 7: Уменьшите шум при измерениях. Запустите свой тест на тихой машине и запустите его несколько раз, отбросив выбросы. Используйте -Xbatch
для сериализации компилятора с приложением и рассмотрите настройку -XX:CICompilerCount=1
, чтобы предотвратить параллельную работу компилятора с самим собой.
Правило 8: Используйте библиотеку для своего теста, поскольку она, вероятно, более эффективна и уже отлаживается для этой единственной цели. Например, JMH, Caliper или Bill and Paul's Excellent UCSD Benchmarks for Java.
См. [Этот вопрос] [1] из нескольких минут назад для получения некоторой информации. Редактировать: извините, это не должно быть ответом. Я должен был разместить комментарий. [1]: http://stackoverflow.com/questions/503877/how-can-i-measure-time-with-microsecond-precision-in-java – Tiago
Именно после того, как планировалось направить плакат этого вопрос на такой вопрос, что я отметил, что этого вопроса не существует. Итак, вот он, надеюсь, с течением времени соберет несколько полезных советов. –
Java 9 может предоставить некоторые функции для микро-бенчмаркинга: http://openjdk.java.net/jeps/230 – Raedwald