#java #scala #profiling
#java #scala #профилирование
Вопрос:
Недавно я обнаружил, что программа, которую я написал, работает на удивление медленно, и в попытке это исправить я хотел бы ее профилировать. Моими инструментами выбора до сих пор были Yourkit и hprof, но я не смог найти функциональность, которую я ищу ни в том, ни в другом.
В идеале я хотел бы тепловую карту в стиле профилировщика MATLAB для всех моих исходных файлов с более яркими цветами, указывающими на то, что в этой строке было потрачено больше времени. Я понимаю, что это большой вопрос, поэтому, если его не существует, я не удивлюсь.
Если вышеуказанное невозможно, я хотел бы иметь возможность выполнять профилирование в стиле hprof cpu=samples, но вместо того, чтобы выдавать список ВСЕХ методов всех классов, выполняемых в проекте, я хотел бы иметь возможность исключать пространства имен (например: java., scala.collection.) и в любое время приписывать этим методам, которые будут повторно приписаны самому низкому уровню в стеке, где метод был вызван НЕ в исключенном пространстве имен. Например, если у меня есть что-то вроде следующего
def sillyMethod: Unit = {
0.until(1000000).map{ i =>
(0 until 1000).toSeq 1) == ( 0 until 1000).toSeq 2 )
}
}
Я бы предпочел знать, что все мое время тратится на sillyMethod, а не на Seq.equals. Возможно ли это с помощью любого доступного профилировщика?
РЕДАКТИРОВАТЬ: в настоящее время я использую sbt для выполнения своих команд и IntelliJ IDEA для фактического редактирования.
Ответ №1:
Я не смотрел на yourkit очень долгое время, но я был бы удивлен, если бы его профилировщик не смог исключить пакеты или ограничить профилированные пакеты. На самом деле JVM поставляется с профилировщиком, который не так уж плох. visualvm входит в состав jdk. Обратите внимание, что на втором снимке экрана на странице профилирования внизу есть раздел «профилирование только классов», поэтому, если вы поместите туда только свой пакет, вы не будете профилировать что-либо еще, или вы можете углубиться только до профилирования определенных пакетов или классов.
Ответ №2:
JProfiler имеет граф вызовов, который может работать на уровне агрегации классов и пакетов.
И если вы укажете свои пакеты верхнего уровня в настройках сеанса, вы не увидите никаких внутренних компонентов классов Scala.
Отказ от ответственности: моя компания разрабатывает JProfiler