2011-06-03 4 views
1

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

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

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

ответ

5

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

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

+0

Спасибо, это был очень полезный ответ. Влияние на использование этого метода измерения времени хорошо известно мне, и все в порядке. Я мог бы отобразить время, но отображать только общий процент по сравнению со всеми другими исполнениями. –

 Смежные вопросы

  • Нет связанных вопросов^_^