Есть ли какой-либо профилировщик Java, который позволяет представлять недолгие приложения? Профилировщики, которых я нашел до сих пор, кажется, работают с приложениями, которые продолжают бежать до пользовательского завершения. Однако я хочу представить приложения, которые работают как утилиты командной строки, это работает и сразу выходит. Инструменты как visualvm или Профилировщик NetBeans даже не распознают, что приложение было, работал.
Я ищу что-то подобное cProfile Python в этом, результат профилировщика возвращается, когда приложение выходит.
Вы можете профилировать свое приложение с помощью встроенной JVM HPROF.
Он предоставляет два метода:
Этот метод показывает, как часто методы находились на вершине стека.
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
Если это не займет достаточно времени, просто оберните вокруг него цикл, если хотите, бесконечный цикл. Это не повлияет на инклюзивные проценты времени, потраченного ни на функции, ни на строки кода. Затем, учитывая, что это занимает много времени, я просто полагаюсь на эту технику . Это говорит о том, какие строки кода, независимо от того, являются ли они вызовами функций или нет, требуют наибольшего процента времени и, следовательно, выиграют больше всего, если их можно будет избежать.
SD Java Profiler может захватывать данные подсчета выполнения блока операторов независимо от того, насколько короток ваш цикл. Относительный подсчет выполнения покажет вам, на что потрачено время.
Sun Java 6 имеет java -Xprof
переключатель, который предоставит вам некоторые данные профилирования.
-Xprof output cpu profiling data
Профилирование краткосрочных приложений Java связано с двумя техническими трудностями:
Вы можете решить эту проблему, изменив приложение так, чтобы оно запускалось несколько раз в цикле, как предлагает @Mike. У вас возникнут проблемы, если ваше приложение вызовет System.exit ()
, но основная проблема в том, что ...
Я не знаю, пытаются ли профилировщики компенсировать эффекты разогрева JVM.Но даже если это так, эти эффекты влияют на реальное поведение ваших приложений, и разработчик приложения мало что может сделать, чтобы их смягчить.
Возвращаясь к моему предыдущему пункту ... если вы запускаете недолговечное приложение в цикле, вы фактически делаете что-то, что изменяет его нормальный шаблон выполнения и удаляет компонент разогрева JVM. Поэтому, когда вы оптимизируете метод, который занимает (скажем) 50% времени выполнения в модифицированном приложении, это действительно 50% времени , исключая разогрев JVM . Если разминка JVM использует (скажем) 80% времени выполнения, когда приложение выполняется нормально, вы фактически оптимизируете 50% из 20% ... и это не стоит усилий.
YourKit может сделать снимок сеанса профиля, который впоследствии можно будет проанализировать в графическом интерфейсе YourKit. Я использую его, чтобы профилировать краткосрочное приложение командной строки, над которым я работаю. См. Мой ответ на this вопрос для подробностей.
Предлагаю вам попробовать свой набор. Он может профилировать с самого начала и сбрасывать результаты по завершении программы. Вы должны заплатить за это, но вы можете получить пробную лицензию или использовать версию EAP без нее. (Время ограничено)
Программа, выполняющаяся 30 секунд, не является недолговечной. Вам нужен профилировщик, который может запускать вашу программу вместо того, чтобы подключаться к работающей системе. Я считаю, что большинство профилировщиков могут это сделать, но вам, скорее всего, больше всего понравится интегрированный в IDE. Взгляните на Netbeans.
запустите приложение с включенным профилированием, ожидая подключения профилировщика. Любой профилировщик, соответствующий архитектуре профилирования Java, должен работать. Я пробовал это с NetBe Профайлер ans.
в основном, когда ваше приложение запускается, оно ожидает присоединения профилировщика перед выполнением. Таким образом, технически можно профилировать даже строку выполнения кода.
при таком подходе вы можете профилировать все, что угодно: потоки, память, процессор, время / продолжительность вызова метода / класса ...