Я провел 10 лет, работая над коммерческими профилировщиками производительности Java для использования как в разработке, так и в производстве.
Краткий ответ - да, вы правы. Вы не можете это осуществить. И даже если бы вы могли, положить что-то кроме тривиального инструментария в метод, который вызывается так часто, можно:
- Изменить способ обработки кода JIT, таким образом
искажение показателей производительности сложно предсказать (но, как правило, бесполезно с точки зрения настройки производительности).
(и давайте не будем начинать с того, как выполнение системного вызова в том, что по сути представляет собой узкий цикл сборки после того, как JIT выполнен с ним, влияет на все причудливые оптимизации, которые ЦПУ мог бы сделать в плане предварительных выборок, вызывая в противном случае ненужное переключение контекста и очистка кэша L1 и т. д. и т. д.)
Это нормально, если инструмент медленнее (или, может быть, «нечасто вызванный» будет лучше?). Например, вы можете избавиться от инструментария, например, большого количества JDBC API для выявления проблем с базой данных.
Для фактической настройки производительности реального Java-кода (в отличие от таких вещей, как Java-вызовы, такие как сеть, файловая система, база данных и т. Д.), Инструментарий просто не подходит. Вы получите более понятные результаты, но никто не занимался инструментами линейного уровня для настройки производительности, вероятно, уже 7 лет - по тем же причинам.
Вместо этого коммерческие профилировщики используют технологию «выборки» - они периодически принимают трассировку стека. У JVMTI есть несколько приятных звонков, которые делают его довольно дешевым каждые несколько мс. Затем вы предполагаете, что все время между трассировками стека было потрачено на новый стек (что, очевидно, не соответствует действительности, но статистически оно дает точные результаты в течение не столь тупо короткого периода измерения) - и у вас есть некоторые действенные показатели производительности без сумасшедших накладных расходов или какого-либо эффекта наблюдателя.