Джава:Как я могу увидеть, какие части моего кода выполняются чаще всего?(профилирование)

StackOverflow https://stackoverflow.com/questions/90176

Вопрос

Я пишу простую игру в шашки на Java.Когда я навожу курсор мыши на плату, мой процессор увеличивается до 50% (100% по ядру).

Я хотел бы узнать, какая часть моего кода (при условии, что это моя вина) выполняется во время этого.

Я пробовал отладку, но пошаговая отладка в этом случае работает не очень хорошо.

Есть ли какой-нибудь инструмент, который может сказать мне, в чем заключается моя проблема?В настоящее время я использую Eclipse.

Это было полезно?

Решение

Это называется «профилирование».Ваша IDE, вероятно, поставляется с одним из них:видеть Профилировщики с открытым исходным кодом в Java.

Другие советы

Используйте профилировщик (например, твой комплект )

Профилирование?Я не знаю, какую IDE вы используете, но У Eclipse приличный профиль а также есть список некоторых профилировщиков с открытым исходным кодом на сайте Java-источник.

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

Я не особо описываю свои программы, поэтому у меня не так уж много опыта, но я поигрался с NetBeans IDE профилировщик, когда я его тестировал.(Я обычно также использую Eclipse.Я также рассмотрю возможности профилирования в Eclipse.)

Профилировщик NetBeans сообщит вам, какой поток выполнялся и как долго, какие методы и как долго вызывались, а также предоставит гистограммы, показывающие, сколько времени занял каждый метод.Это должно дать вам подсказку относительно того, какой метод вызывает проблемы.Вы можете взглянуть на Java-профилировщик которые предоставляет IDE NetBeans, если вам интересно.

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

Удачи!

1) Это твоя вина :)

2) Если вы используете eclipse или netbeans, попробуйте использовать функции профилирования — они довольно быстро подскажут вам, где ваш код тратит много времени.

3) в противном случае добавьте вывод консоли там, где, по вашему мнению, находится внутренний цикл - вы сможете быстро его найти.

Да, есть такие инструменты:вам нужно профилировать код.Вы можете попробовать ТПТП в затмении или, возможно, попробуйте JПрофилер.Это позволит вам увидеть, что вызывается и как часто.

Используйте профайлер.Есть много.Вот список: http://java-source.net/open-source/profilers.Например, вы можете использовать СИП, профилировщик с кодом Java.

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

Доступны плагины для Eclipse, Maven, Ant и IDEA.Это бесплатно для открытого исходного кода, или вы можете получить 30-дневная пробная лицензия.

Если вы используете Sun Java 6, то самые последние выпуски JDK поставляются с JVisualVM в каталоге bin.Это мощный инструмент для мониторинга и профилирования, для использования которого потребуется очень мало усилий — вам даже не нужно запускать программу со специальными параметрами — JVisualVM просто перечисляет все запущенные в данный момент Java-процессы, и вы выбираете тот, с которым хотите поиграть. .

Этот инструмент сообщит вам, какие методы используют все процессорное время.

Существует множество более мощных инструментов, но сначала попробуйте бесплатный.Затем, когда вы прочитаете о том, какие еще функции доступны, вы поймете, как они могут вам помочь.

Это типичная проблема «Высокая загрузка ЦП».

Есть два типа проблем с высокой загрузкой процессора

а) Когда в потоке используется 100% ЦП одного ядра (это ваш сценарий)

б) Загрузка ЦП «аномально высока» при выполнении определенных действий.В таких случаях загрузка ЦП может быть не 100%, а аномально высокой.Обычно это происходит, когда в коде выполняются операции с интенсивным использованием процессора, такие как синтаксический анализ XML, сериализация, десериализация и т. д.

Случай (а) легко анализировать.Когда вы испытываете 100% загрузку ЦП, 5-6 потоков выгружаются с интервалом в 30 секунд.Найдите поток, который активен (в «работоспособном» состоянии) и находится внутри того же метода (вы можете сделать это, отслеживая стек потоков).Скорее всего, вы увидите «занято ожидание» (пример см. в коде ниже).

while(true){
  if(status) break;
  // Thread.sleep(60000); // such a statement would have avoided busy wait
}

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

Я всегда сначала пробую использовать дампы потоков.Профилировщики будут только последним средством.В 80% случаев мы сможем выявить это с помощью дампов потоков.

Или используйте тестовые примеры JUnit и инструмент покрытия кода для некоторых ваших общих компонентов.Если есть компоненты, которые вызывают другие компоненты, вы быстро увидите, что они выполняются еще много раз.

Я использую Clover с тестовыми примерами JUnit, но я слышал, что для открытого исходного кода EMMA довольно хороша.

В однопоточном коде я обнаружил добавление таких операторов:System.out.println("A:"+ System.currentTimeMillis());проще и эффективнее, чем использование профилировщика.Вскоре вы сможете сузить часть кода, вызывающую проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top