Измерьте время выполнения Java с помощью JVMTI - PullRequest
1 голос
/ 11 мая 2011

Для профилировщика, который я реализую с помощью JVMTI , я хотел бы начать измерять время выполнения всех методов Java. JVMTI предлагает события:

  • MethodEntry
  • MethodExit

Так что это было бы довольно легко реализовать, однако я натолкнулся на примечание в API:

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

Но мой агент профилирования работает без головы, что означает, что собранные данные сериализуются и отправляются через сокет в серверное приложение, отображающее результаты. Как я должен понять это, используя инструментарий байт-кода. Я как-то не понимаю, как идти дальше. Может ли кто-нибудь объяснить мне, нужно ли мне менять стратегию или как я могу подойти к этой проблеме?

1 Ответ

1 голос
/ 11 мая 2011

Я не знаю о Sun JVM, но IBM JVM переходит в то, что мы называем режимом FullSpeedDebug, когда вы запрашиваете события MethodEntry / Exit .... FSD немного замедляет выполнение.

КакВы говорите, что можете использовать BCI, как мой профилировщик, но если вы не будете выбирать, какие методы вы используете, вы также увидите замедление.Например, мой профилировщик вставляет if (profiling) callProfilerHook () в каждую запись и все возможные выходы в методе, который создает весь объект, а также в некоторых других областях .... Эти дополнительные проверки могут замедлить выполнение более чем на 50%...

Что касается того, как BCI ... ну, я написал свою собственную библиотеку C, чтобы сделать это ... это технически не сложно (подсказка просто удалить StackMapTable), но я могу занять некоторое время ... В качестве альтернативыВы можете использовать ASM et.al.

Наконец ... ваш callBackHook добавит накладные расходы и при небольших методах сделает израсходованное время ЦП / Часы бессмысленным, если вы не выполните некоторые сложные вычисления служебных данных ... даже если вы сделаете это, ваш код обратного вызова повлияет на формукэшей L1 процессора, и код Java становится менее эффективным, потому что в нем меньше местапоток всего кода, фактически в большинстве случаев, какой код выполняется (большинство проектов Java не имеют представления о миллионах строк стороннего кода, выполняющегося в их приложении)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...