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

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

SELECT u.*, p.method, p.id AS payment_id 
FROM `users` u, `payments` p
WHERE u.id = p.user_id 
    AND p.id = (SELECT MAX(p2.id) FROM payments p2
                    WHERE p2.user_id = u.id);

Я не тестировал тесты, но db, над которым я работаю, имеет более 50 000 пользователей и более 60 000 платежей и запрос выполняется за 0,024 секунды.

10
задан jjnguy 20 November 2012 в 03:02
поделиться

12 ответов

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

12
ответ дан 3 December 2019 в 16:31
поделиться

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

3
ответ дан 3 December 2019 в 16:31
поделиться

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

2
ответ дан 3 December 2019 в 16:31
поделиться

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

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

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

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

Удачи!

2
ответ дан 3 December 2019 в 16:31
поделиться

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

1
ответ дан 3 December 2019 в 16:31
поделиться

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

1
ответ дан 3 December 2019 в 16:31
поделиться

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

Плагины для Eclipse, Знатока, Муравья и ИДЕИ доступны. Это свободно для открытого исходного кода, или можно получить 30-дневную лицензию оценки.

1
ответ дан 3 December 2019 в 16:31
поделиться

1) Это - Ваш отказ :)

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

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

1
ответ дан 3 December 2019 в 16:31
поделиться

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

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

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

1
ответ дан 3 December 2019 в 16:31
поделиться

Это - обычно 'Высокий ЦП' проблема.

Существует два вида высоких проблем ЦП

a) Где на потоке использует 100% ЦП одного ядра (Это - Ваш сценарий),

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

Случай (a) легко проанализировать. Когда Вы испытываете 100% ЦП 5-6 дампов потока в интервале 30 секунд. Ищите поток, который активен (в "выполнимом" состоянии) и который является в том же методе (можно вывести это путем контроля стопки потока). По всей вероятности то, что Вы будете видеть 'активное ожидание' (см. код ниже для примера),

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

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

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

1
ответ дан 3 December 2019 в 16:31
поделиться

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

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

0
ответ дан 3 December 2019 в 16:31
поделиться

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

0
ответ дан 3 December 2019 в 16:31
поделиться
Другие вопросы по тегам:

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