Измерение производительности программ Java - PullRequest
2 голосов
/ 04 марта 2012

У меня было старое приложение, файл JAR, который прошел некоторые улучшения. В основном некоторые части кода должны были быть изменены вместе с изменением некоторой логики.

Сравнивая старую версию с новой версией, новая версия примерно в 2 раза медленнее старой.

Я пытаюсь сузить причины замедления, но я измеряю время для определенных циклов for, используя System.println с System.currentTimeMillis (). Это действительно становится очень утомительным.

Есть ли инструмент производительности Java, который поможет мне понять, почему NEW JAR примерно в 2 раза медленнее старого?

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 04 марта 2012

JProfiler имеет возможность сравнивать снимки процессора.Запишите выполнение для старого и нового файла JAR и сохраните снимки (если JVM завершает работу в конце, настройте триггер «Выход JVM», который сохраняет снимок).

Затем откройте окно сравнения снимков с помощью »Сессия-> Сравнить снимки в новом окне "и добавить два снимка.Сравнение горячих точек будет выглядеть следующим образом (в этом случае установлен фильтр просмотра):

enter image description here

Он сразу покажет вам, какие методы ответственны за увеличение времени выполнения.

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

enter image description here

Отказ от ответственности: Моя компания разрабатывает JProfiler.

1 голос
/ 04 марта 2012

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

Java поставляется со встроенным профилировщиком, который называется hprof , но см. Также:

0 голосов
/ 04 марта 2012

Инструмент для профилирования, такой как YourKit или что-то для надежного измерения производительности, например Hyperic's Sigar , является хорошим кандидатом для вашего случая.Посмотрите на эти инструменты.Первый обнаружит узкие места в вашем коде и / или утечках памяти (не все), в то время как последний является API-интерфейсом, позволяющим надежно измерять производительность, поскольку Oracle JVM & OpenJDK не имеет способа получать показатели производительности надежно / согласованно / точнонапример, время настенного процессора или время процессора, потраченное приложением, использование памяти, потоки приложения и т. д.).По умолчанию Java предоставляет пакеты для этих вещей.Например:java.lang.management.ManagementFactoryjava.lang.management.ThreadMXBeanно в зависимости от вашего случая они могут быть или не быть адекватными (имейте в виду, что в большинстве случаев они в порядке, если мы не говорим о чем-то критическом).

0 голосов
/ 04 марта 2012

В зависимости от того, как долго выполняется процесс, я думаю о Visual VM 1.3.3.Если вы загрузите все плагины, вы сможете увидеть кучу, потоки, объекты и т. Д. Это должно помочь, и это не будет стоить ни цента.JVM.

...