Какой ваш любимый инструмент профилирования (для C ++) [закрыто]


83

До сих пор я использовал только Rational Quantify. Я много слышал о Intel VTune, но никогда не пробовал!

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


Смотрите также:

Какие хорошие профилировщики для нативного C ++ в Windows?


Вы хотите 1) измерить или вы хотите 2) найти ускорение? Если вы хотите 2 и думаете, что для этого требуется 1, это не так. Чтобы найти ускорение, вам не нужны «очень хорошие результаты». Если программа тратит 90% своего времени на то, что вы вполне могли бы удалить, если бы знали, что это было, образцы стека покажут вам это 9 раз из 10. Если вы посмотрите на 10 образцов, вас волнует, если вы увидите это 10 раз, 9 раз или 8 раз? В любом случае, вы знаете, что это такое . Измеренный процент значения не имеет.
Майк Данлэви,

Ответы:


35

Для разработки под Linux (хотя некоторые из этих инструментов могут работать на других платформах). Это два известных мне именитых имени и множество других, более мелких, которые давно не разрабатывались.


28

Для Linux: Google Perftools

  • Быстрее, чем валгринд (но не такой мелкозернистый)
  • Не требует инструментовки кода
  • Хороший графический вывод (-> kcachegrind)
  • Выполняет профилирование памяти, профилирование процессора, проверку утечек

9

ИМХО, выборка с помощью отладчика - лучший метод. Все, что вам нужно, это IDE или отладчик, позволяющий остановить программу. Он решает проблемы с производительностью еще до того, как вы установили профилировщик.


3
Да! Это отлично работает для меня. Не требует инструментов. Он не требует установки профилировщика и т. Д. В Linux вы можете использовать gdb. Программа работает на полной скорости. Нажмите ctrl-c, чтобы остановиться. введите «bt», чтобы отобразить трассировку стека. Затем нажмите c, чтобы продолжить, затем снова ctrl-c. Работает отлично! Просто уменьшил время выполнения на 20% в сложной программе, используя эту технику. Потрясающе!
Хью Перкинс,

@HughPerkins: Спасибо за редактирование, и я рад, что у вас все получается. (Бьюсь об заклад, вы можете добиться большего, чем 20% :)
Майк Данлэви

1
Да, я уменьшил время итерации с 1200 мс до 200 мс, за несколько часов работы, используя только gdb + ctrl-c, чтобы найти горячие точки :-)
Хью Перкинс

@HughPerkins: Для меня, если я работаю над своим собственным кодом, трудно понять, когда прекратить попытки - кажется, я всегда могу выжать еще немного. Когда я работаю над чужим кодом, может возникнуть проблема. Я не всегда могу убедить «владельца» кода исправить проблему, поэтому процесс останавливается. Это интересная головоломка.
Майк Данлэви,

Если вы просто хотите добиться этого без инструментов, вам не понадобится даже отладчик или IDE в Linux. Просто запустите "pstack <pid>", чтобы отследить текущую инструкцию в стеке. Это намного проще, чем запускать отладчик, а затем разрывать его вручную и искать трассировку стека.
Маниш Соги

7

Мой единственный опыт профилирования кода C ++ связан с AQTime от AutomatedQA (теперь SmartBear Software). Он имеет несколько типов встроенных профилировщиков (производительность, память, дескрипторы Windows, трассировка исключений, статический анализ и т. Д.) И инструментарий кода для получения результатов.

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


К сожалению, это работает только в Windows.
Брэм

6

Я никогда раньше не занимался профилированием. Вчера я запрограммировал класс ProfilingTimer со статическим расписанием (карта <std :: string, long long>) для хранения времени.

Конструктор сохраняет начальный тик, а деструктор вычисляет прошедшее время и добавляет его на карту:

ProfilingTimer::ProfilingTimer(std::string name)
 : mLocalName(name)
{
 sNestedName += mLocalName;
 sNestedName += " > ";

 if(sTimetable.find(sNestedName) == sTimetable.end())
  sTimetable[sNestedName] = 0;

 mStartTick = Platform::GetTimerTicks();
}

ProfilingTimer::~ProfilingTimer()
{
 long long totalTicks = Platform::GetTimerTicks() - mStartTick;

 sTimetable[sNestedName] += totalTicks;

 sNestedName.erase(sNestedName.length() - mLocalName.length() - 3);
}

В каждую функцию (или {блок}), которую я хочу профилировать, мне нужно добавить:

ProfilingTimer _ProfilingTimer("identifier");

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

(Кто-нибудь еще работает с подобным "самодельным профилированием"? Или это просто глупо? Но весело! Есть ли у кого-нибудь предложения по улучшению?

Есть ли какое-то автодобавление строчки ко всем функциям?)


5

В прошлом я широко использовал Glowcode, и у меня не было ничего, кроме положительного опыта. Его интеграция с Visual Studio действительно хороша, и это самый эффективный / интуитивно понятный профилировщик, который я когда-либо использовал (даже по сравнению с профилировщиками для управляемого кода).

Очевидно, что это бесполезно, если вы не работаете в Windows, но вопрос оставляет мне неясным, каковы ваши требования.


5

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


5

Профилировщик в Visual Studio 2008 очень хорош: быстрый, удобный, понятный и хорошо интегрированный в IDE.


2
Разве профилировщик не только в командной версии?
dwj

@dwj: Я не уверен. Я использую Visual Studio Team System 2008 Development Edition.
Dimitri C.

Похоже, это только в версии Team ( stackoverflow.com/questions/61669/… ) для версий до 2010 г.
dwj

4

Для Windows попробуйте Xperf . Он использует образец профиля, имеет полезный пользовательский интерфейс и не требует инструментовки. Очень полезно для отслеживания проблем с производительностью. Вы можете ответить на такие вопросы, как:

  • Кто использует больше всего ЦП? Переходите к имени функции с помощью стеков вызовов.
  • Кто выделяет больше всего памяти?
  • Кто делает больше всего запросов к реестру?
  • Диск пишет? и т.п.

Вы будете очень удивлены, когда найдете узкие места, поскольку они, вероятно, находятся не там, где вы ожидали!


4

Для Windows я пробовал AMD Codeanalyst, Intel VTune и профилировщик в Visual Studio Team Edition.

Codeanalyst содержит ошибки (часто дает сбой), и в моем коде его результаты часто неточны. Его пользовательский интерфейс не интуитивно понятен. Например, чтобы отобразить стек вызовов в результатах профиля, вам нужно щелкнуть вкладку «Процессы», затем щелкнуть имя EXE-файла вашей программы, затем щелкнуть кнопку панели инструментов с крошечными буквами «CSS» на ней. Но это бесплатное программное обеспечение, поэтому вы можете попробовать его, и оно работает (с меньшим количеством функций) без процессора AMD.

У VTune (700 долларов) ужасный пользовательский интерфейс IMO; в большой программе трудно найти конкретное дерево вызовов, которое вы хотите, и вы можете смотреть только на один «узел» в программе за раз (функция с ее непосредственными вызывающими и вызываемыми объектами) - вы не можете смотреть на полное дерево звонков. Есть представление графика вызовов, но я не смог найти способ, чтобы относительное время выполнения отображалось на графике. Другими словами, функции на графике выглядят одинаково, независимо от того, сколько времени на них было потрачено - как будто они полностью упустили точку профилирования.

Профилировщик Visual Studio имеет лучший графический интерфейс из трех, но по какой-то причине он не может собирать образцы из большей части моего кода (образцы собираются только для нескольких функций во всей моей программе на C ++). Кроме того, я не мог найти цену или способ купить его напрямую; но он поставляется с подпиской MSDN моей компании. Visual Studio поддерживает управляемый, собственный и смешанный код; Я не уверен насчет двух других профилировщиков в этом отношении.

В заключение, я еще не знаю хорошего профилировщика! Я обязательно ознакомлюсь с другими предложениями здесь.


3

Существуют разные требования к профилированию. В порядке ли инструментированный код, или вам нужно профилировать оптимизированный код (или даже уже скомпилированный код)? Вам нужна построчная информация профиля? На какой ОС вы работаете? Вам также нужно профилировать общие библиотеки? А как насчет трассировки системных вызовов?

Лично я использую oprofile для всего, что делаю, но это может быть не лучший выбор в каждом случае. Vtune и Shark тоже превосходны.


3

Поскольку вы не упоминаете платформу, над которой работаете, я скажу cachegrind под Linux. Определенно. Это часть набора инструментов Valgrind.

http://valgrind.org/info/tools.html

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

Обратите внимание, что доступен внешний интерфейс KCachegrind.


3

Для разработки под Windows я использовал средство проверки производительности Software Verification - он быстрый, достаточно точный и недорогой. Еще лучше то, что он может инструментировать выполняющийся процесс и позволяет вам включать и выключать сбор данных во время выполнения, как вручную, так и на основе стека вызовов - отлично подходит для профилирования небольшого раздела более крупной программы.


3

Я использую devpartner для платформы pc.


Это инструментальный код. Он имеет покрытие кода и проверку границ (инструментальную и неинструментированную)
EvilTeach

2

Я попробовал Quantify an AQTime, и Quantify выиграл благодаря своим бесценным функциям «сосредоточиться на поддереве» и «удалить поддерево».


Полный акк. Мне просто нужно было профилировать приложение C ++, и это были именно те функции, которые действительно сделали мой день.
Энно,

2

Единственный чувствительный ответ - PTU от Intel. Конечно, лучше всего использовать его на процессоре Intel и получить еще более ценные результаты, по крайней мере, на машине C2D, поскольку сама архитектура легче возвращает значимые профили.


2

Я много лет использовал VTune под Windows и Linux с очень хорошими результатами. Более поздние версии стали хуже, когда они передали этот продукт на аутсорсинг своей российской команде разработчиков, качество и производительность упали (увеличилось количество сбоев VTune, часто 15+ минут на открытие файла анализа).

Что касается инструментовки, вы можете обнаружить, что она менее полезна, чем вы думаете. В тех приложениях, над которыми я работал, добавление инструментовки часто замедляет работу продукта настолько, что он больше не работает (реальная история: запустить приложение, пойти домой, вернуться на следующий день, приложение все еще инициализируется). Кроме того, при профилировании без инструментов вы можете реагировать на текущие проблемы. Например, с помощью удаленного сборщика дат VTune я могу запустить сеанс выборки на реальном сервере с сотнями одновременных подключений, который испытывает проблемы с производительностью, и выявить проблемы, возникающие в производственной среде, которые я никогда не смогу воспроизвести в тестовой среде.



1

Мой любимый инструмент - Easy Profiler: http://code.google.com/p/easyprofiler/

Это профилировщик времени компиляции: исходный код должен быть вручную инструментирован с использованием набора подпрограмм для описания целевых регионов. Однако после того, как приложение запущено и измерения автоматически записываются в файл XML, остается лишь открыть приложение Observer и сделать несколько щелчков мышью по инструментам анализа / сравнения, прежде чем вы сможете увидеть результат на качественной диаграмме.


1

Профайлер Visual Studio 2010 под Windows. У VTune был отличный инструмент для построения графиков вызовов, но в Windows Vista / 7 он сломался. Не знаю, исправили ли они это.


0

Позвольте мне предложить EQATEC ... именно то, что я искал ... простой в изучении и использовании, и дает мне информацию, необходимую для быстрого поиска горячих точек. Я предпочитаю его встроенному в Visual Studio (хотя, честно говоря, я еще не пробовал VS 2010).

Возможность делать снимки ОГРОМНАЯ. Я часто выполняю дополнительный анализ и оптимизацию, ожидая запуска настоящего целевого анализа ... мне это нравится.

Да, и его базовая версия бесплатна!
http://www.eqatec.com/Profiler/

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.