Профилирование недолгих JAVA-приложений

Есть ли какой-либо профилировщик Java, который позволяет представлять недолгие приложения? Профилировщики, которых я нашел до сих пор, кажется, работают с приложениями, которые продолжают бежать до пользовательского завершения. Однако я хочу представить приложения, которые работают как утилиты командной строки, это работает и сразу выходит. Инструменты как visualvm или Профилировщик NetBeans даже не распознают, что приложение было, работал.

Я ищу что-то подобное cProfile Python в этом, результат профилировщика возвращается, когда приложение выходит.

8
задан ejel 16 April 2010 в 20:54
поделиться

9 ответов

Вы можете профилировать свое приложение с помощью встроенной JVM HPROF.

Он предоставляет два метода:

  1. выборка активных методов в стеке
  2. синхронизация время выполнения метода с использованием введенного байт-кода (BCI, внедрение байтового кода)

Выборка

Этот метод показывает, как часто методы находились на вершине стека.

java -agentlib:hprof=cpu=samples,file=profile.txt ...

Время

Этот метод подсчитывает фактические вызовы метода. Инструментальный код был введен JVM заранее.

java -agentlib:hprof=cpu=times,file=profile.txt ...

Примечание: этот метод значительно замедляет время выполнения.


Для обоих методов имя файла по умолчанию - java.hprof.txt , если параметр file = отсутствует.

Полная справка может быть получена с помощью java -agentlib: hprof = help или может быть найдена в документации Oracle

8
ответ дан 5 December 2019 в 06:09
поделиться

Если это не займет достаточно времени, просто оберните вокруг него цикл, если хотите, бесконечный цикл. Это не повлияет на инклюзивные проценты времени, потраченного ни на функции, ни на строки кода. Затем, учитывая, что это занимает много времени, я просто полагаюсь на эту технику . Это говорит о том, какие строки кода, независимо от того, являются ли они вызовами функций или нет, требуют наибольшего процента времени и, следовательно, выиграют больше всего, если их можно будет избежать.

2
ответ дан 5 December 2019 в 06:09
поделиться

SD Java Profiler может захватывать данные подсчета выполнения блока операторов независимо от того, насколько короток ваш цикл. Относительный подсчет выполнения покажет вам, на что потрачено время.

1
ответ дан 5 December 2019 в 06:09
поделиться

Sun Java 6 имеет java -Xprof переключатель, который предоставит вам некоторые данные профилирования.

-Xprof            output cpu profiling data
5
ответ дан 5 December 2019 в 06:09
поделиться

Профилирование краткосрочных приложений Java связано с двумя техническими трудностями:

  • Инструменты профилирования обычно работают, периодически выбирая регистр процессора процессора или ПК, чтобы увидеть, где приложение в настоящее время выполняется. Если ваше приложение недолговечно, может быть взято недостаточно образцов для получения точной картины.

Вы можете решить эту проблему, изменив приложение так, чтобы оно запускалось несколько раз в цикле, как предлагает @Mike. У вас возникнут проблемы, если ваше приложение вызовет System.exit () , но основная проблема в том, что ...

  • Характеристики производительности недолговечного Java-приложения, вероятно, будут искажены JVM. эффекты вверх. Много времени будет потрачено на загрузку классов, необходимых вашему приложению. Затем ваш код (и код библиотеки) будет немного интерпретироваться, пока JIT-компилятор не выяснит, что нужно скомпилировать в собственный код. Наконец, JIT-компилятор потратит время на выполнение своей работы.

Я не знаю, пытаются ли профилировщики компенсировать эффекты разогрева JVM.Но даже если это так, эти эффекты влияют на реальное поведение ваших приложений, и разработчик приложения мало что может сделать, чтобы их смягчить.

Возвращаясь к моему предыдущему пункту ... если вы запускаете недолговечное приложение в цикле, вы фактически делаете что-то, что изменяет его нормальный шаблон выполнения и удаляет компонент разогрева JVM. Поэтому, когда вы оптимизируете метод, который занимает (скажем) 50% времени выполнения в модифицированном приложении, это действительно 50% времени , исключая разогрев JVM . Если разминка JVM использует (скажем) 80% времени выполнения, когда приложение выполняется нормально, вы фактически оптимизируете 50% из 20% ... и это не стоит усилий.

4
ответ дан 5 December 2019 в 06:09
поделиться

YourKit может сделать снимок сеанса профиля, который впоследствии можно будет проанализировать в графическом интерфейсе YourKit. Я использую его, чтобы профилировать краткосрочное приложение командной строки, над которым я работаю. См. Мой ответ на this вопрос для подробностей.

0
ответ дан 5 December 2019 в 06:09
поделиться

Предлагаю вам попробовать свой набор. Он может профилировать с самого начала и сбрасывать результаты по завершении программы. Вы должны заплатить за это, но вы можете получить пробную лицензию или использовать версию EAP без нее. (Время ограничено)

0
ответ дан 5 December 2019 в 06:09
поделиться

Программа, выполняющаяся 30 секунд, не является недолговечной. Вам нужен профилировщик, который может запускать вашу программу вместо того, чтобы подключаться к работающей системе. Я считаю, что большинство профилировщиков могут это сделать, но вам, скорее всего, больше всего понравится интегрированный в IDE. Взгляните на Netbeans.

4
ответ дан 5 December 2019 в 06:09
поделиться

запустите приложение с включенным профилированием, ожидая подключения профилировщика. Любой профилировщик, соответствующий архитектуре профилирования Java, должен работать. Я пробовал это с NetBe Профайлер ans.

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

при таком подходе вы можете профилировать все, что угодно: потоки, память, процессор, время / продолжительность вызова метода / класса ...

http://profiler.netbeans.org/

2
ответ дан 5 December 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: