Как получить граф вызовов программы с небольшим количеством информации о профилировании - PullRequest
3 голосов
/ 13 марта 2010

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

Для этого я попытался сначала использовать gprof, а затем gprof2dot, чтобы получить снимки, но результаты иногда выглядят некрасиво.

Как ты обычно это делаешь? Можете ли вы порекомендовать какие-нибудь лучшие альтернативы?

P.D. Какие решения с открытым исходным кодом (предпочтительно для Linux или Mac OS) X?

Ответы [ 6 ]

1 голос
/ 17 марта 2010

OProfile на Linux работает довольно хорошо, на самом деле мне нравится больше, чем GProf. Есть пара графических инструментов, которые помогают визуализировать вывод OProfile.

0 голосов
/ 13 марта 2010

Тот же ответ, что и ---

РЕДАКТИРОВАТЬ: @Steve предложил, чтобы я дал менее содержательный ответ.

Я слышу это все время - "Я хочу выяснить , где моя программа тратит свое время".
Позвольте мне предложить альтернативную формулировку - «Я хочу выяснить , почему моя программа тратит свое время».

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

Есть еще один миф, который я слышу все время: вам нужно измерить время выполнения методов, чтобы найти «медленные». У программ есть много способов занять больше времени, чем нужно, скажем, с помощью линейного поиска вместо двоичного поиска в каком-либо методе, что может быть тем, о чем люди думают.

Способ думать об этом таков:

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

Чтобы посмотреть, что делает программа, с точки зрения времени, вот как много людей делают это .

0 голосов
/ 13 марта 2010

Вы можете попробовать KCachegrind . Это программа, которая визуализирует образцы, полученные инструментом Valgrind под названием Callgrind. Может показаться, что KCachegrind не поддерживается активно, но графики, которые он создает, очень полезны.

0 голосов
/ 13 марта 2010

Если вы хотите взглянуть на структуру вашего приложения (кто что вызывает, ссылки, деревья вызовов, ...), посмотрите на «Понимание C / C ++». Это приложение исследует ваш исходный код и позволяет запрашивать практически все из структуры приложения.

0 голосов
/ 13 марта 2010

На мой взгляд, есть две альтернативы (на Windows):

  • Профилировщики, которые изменяют инструкции по сборке ваших приложений (так называемые инструменты) и записывают каждую деталь. Эти профилировщики, как правило, работают медленно (приложения работают примерно в 10 раз медленнее), иногда их сложно настроить, а зачастую и несвободно, но они дают вам информацию, связанную с наилучшей производительностью. Ищите «Количество рациона», «AQTime» и «Валидатор производительности», если вам нужен профилировщик этого типа.
  • Профилировщики, которые не обрабатывают приложение, а просто смотрят на работающее приложение и собирают его «образцы». Эти профилировщики бывают быстрыми (без потери производительности), часто просты в настройке, и вы можете найти довольно много бесплатных альтернатив. Ищите «Very Sleepy» и «Luke Stackwalker», если вам нужен профилировщик этого типа.

Хотя в прошлом я использовал коммерческие профилировщики, такие как Rational Quantity и AQTime, и был очень доволен результатами, я обнаружил, что недостатки (трудно настраиваемые, необъяснимые сбои, низкая производительность) перевешивают преимущества.

Поэтому я переключился на бесплатные альтернативы и сейчас я в основном использую «Very Sleepy».

0 голосов
/ 13 марта 2010

См. SD C ++ Profiler .

Другие ответы здесь предполагают, что профилировщики, ориентированные на зонды, имеют высокие накладные расходы (10x).Это не так.

...