Java: Как узнать, какие части моего кода работают чаще всего? (Профилирование) - PullRequest
10 голосов
/ 18 сентября 2008

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

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

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

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

Ответы [ 12 ]

12 голосов
/ 18 сентября 2008

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

3 голосов
/ 18 сентября 2008

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

2 голосов
/ 18 сентября 2008

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

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

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

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

Удачи!

2 голосов
/ 18 сентября 2008

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

1 голос
/ 18 сентября 2008

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

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

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

1 голос
/ 18 сентября 2008

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

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

1 голос
/ 18 сентября 2008

Обычно это проблема с высокой загрузкой процессора.

Существует два вида проблем с центральным процессором

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

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

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

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

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

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

1 голос
/ 18 сентября 2008

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

1 голос
/ 18 сентября 2008

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

1 голос
/ 18 сентября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...