Я использую TPTP для профилирования медленно работающего Java-кода и наткнулся на кое-что интересное. Один из моих получателей частной собственности имеет большое значение базового времени в результатах анализа времени выполнения. Честно говоря, это свойство вызывается много-много раз, но я никогда бы не подумал, что такое свойство займет очень много времени:
public class MyClass{
private int m_myValue;
public int GetMyValue(){
return m_myValue;
}
}
Итак, очевидно, что в классе есть еще что-то, но, как вы можете видеть, при вызове геттера больше ничего не происходит (просто возвращает int). Несколько цифр для вас:
- Около 30% вызовов прогона приходится на геттер (я работаю над его уменьшением)
- В этом геттере тратится около 25% базового времени прогона
- Среднее базовое время составляет 0,000175 с.
Для сравнения, у меня есть другой метод в другом классе, который использует этот геттер:
private boolean FasterMethod(MyClass instance, int value){
return instance.GetMyValue() > m_localInt - value;
}
Который имеет гораздо более низкое среднее базовое время 0,000018 с (на порядок ниже).
В чем дело? Я предполагаю, что есть что-то, чего я не понимаю или чего-то не хватает:
- Действительно ли возврат локального примитива занимает больше времени, чем возврат вычисленного значения?
- Должен ли я смотреть на метрику, отличную от базового времени?
- Вводят ли эти результаты в заблуждение, и мне нужно рассмотреть какой-либо другой инструмент профилирования?
Редактировать 1. Основываясь на некоторых предложениях ниже, я отметил метод как окончательный и повторно провел тест, но получил те же результаты.
Изменить 2: я установил демо-версию YourKit, чтобы повторно запустить тесты производительности, и результаты YourKit выглядят намного ближе к тому, что я ожидал. Я продолжу тестировать YourKit и сообщу о том, что найду.
Изменить 3: переход на YourKit, похоже, решил мою проблему. Я смог использовать YourKit для определения фактических медленных точек в моем коде. Ниже есть несколько отличных комментариев и сообщений (соответственно проголосовавших), но я принимаю первого человека, который предложит YourKit как «правильный». (Я никоим образом не связан с YourKit / YMMV)