Зачем использовать JMH, если можно отключить JIT?

Интересно, зачем мне использовать JMH для бенчмаркинга, если я могу отключить JIT? Разве JMH не подавляет оптимизацию, которую можно предотвратить, отключив JIT?


person mmirwaldt    schedule 09.05.2015    source источник
comment
На самом деле, даже подключение профилировщика может отключить оптимизацию. JMH — отличный инструмент, поскольку он позволяет проводить бенчмаркинг и профилирование с наименьшим вмешательством (как это разрешено принципом неопределенности Гейзенберга :)   -  person Aleksandr Dubinsky    schedule 27.05.2015


Ответы (2)


TL;DR; Оцените выступление Формулы 1, проехав на велосипеде по той же трассе.

Вопрос очень странный, особенно если задать себе простой уточняющий вопрос. Какой смысл запускать бенчмарк в условиях, резко отличающихся от вашей производственной среды? Другими словами, как знания, полученные в интерпретируемом режиме, применимы к реальному миру?

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

И, ну, бенчмаркинг — это не только борьба с компилятором. необходимо решить множество проблем, не связанных с компилятором (и не с JVM!). Конечно, это можно сделать вручную (JMH не волшебство, это просто инструмент, который тоже написали люди), но большую часть своего бюджета времени вы потратите на решение простых вопросов, а времени на решение действительно важные, относящиеся к вашему эксперименту.

person Aleksey Shipilev    schedule 10.05.2015

JIT не является пуленепробиваемым и всемогущим. Например, он не сработает до того, как определенный фрагмент кода будет запущен определенное количество раз, или он не сработает, если фрагмент байт-кода слишком велик/слишком глубоко спрятан/и т. д. Кроме того, рассмотрите живое инструментирование, которое чаще всего вообще препятствует работе JIT (вспомните профилирование).

Поэтому интерес остается в том, чтобы иметь возможность либо выключить, либо включить его; если фрагмент кода действительно критичен по времени, вы можете захотеть узнать, как он будет работать в зависимости от того, сработает ли JIT.

Но такие ситуации очень редки и становятся все более и более редкими по мере развития JVM (следовательно, JIT).

person fge    schedule 09.05.2015
comment
Спасибо за ваш ответ. Мне просто интересно, почему я должен предпочесть JMH с JIT обычному самодельному бенчмарку с прогревочными прогонами и достаточным количеством итераций без JIT. JMH дает некоторое утешение, но что еще? Мне очень нравится знать. Может быть, это поможет понять мой вопрос. - person mmirwaldt; 10.05.2015