Выполнение метода измерения с помощью JVMTI - PullRequest
1 голос
/ 03 июня 2011

Используя перехватчики событий MethodEntry и MethodExit, предоставляемые JVMTI, как мне измерить время выполнения метода в Java?

Проще говоря, это просто: time2 - time1 но проблема, которую я вижу, как различать разные методы? Есть methodID, но как насчет рекурсивных вызовов? Когда метод закрывается после его открытия?

Стоит ли сравнивать трассировку стека? Какова будет существенная структура данных для отслеживания методов, которые были введены? Что-то вроде Map<StackTrace,Time>?

1 Ответ

5 голосов
/ 03 июня 2011

Вам понадобится стек для каждого потока, и с каждым MethodEnter вы помещаете метку времени в стек, а на MethodExit вы извлекаете метку времени и вычисляете разницу с текущим временем.

Хотя вы должны иметь в виду, что чтение временных отметок или тиковых счетов, а также окружающей логики занимает довольно много времени. Если вы используете что-то подобное в каком-то профилировщике, вы получите результаты, которые делают маленькие быстрые методы очень дорогими. То есть ByteBuffer.get() может выполняться как минимум в 10 раз быстрее, чем ваш измерительный код. Вместе с искажением из-за ограниченной JIT-компиляции, когда JVMTI активен, такие методы могут легко оказаться в 100 раз тяжелее в собранных данных, чем при нормальных обстоятельствах. Единственный способ получить несколько полезных данных о доле методов во времени выполнения - использовать выборку.

...