До сих пор я использовал только Rational Quantify. Я много слышал о Intel VTune, но никогда не пробовал!
Обновлено: в основном я ищу программное обеспечение, которое будет обрабатывать код, поскольку я думаю, что это единственный способ получить очень хорошие результаты.





Существуют разные требования к профилированию. В порядке ли инструментированный код, или вам нужно профилировать оптимизированный код (или даже уже скомпилированный код)? Вам нужна построчная информация профиля? На какой ОС вы работаете? Вам также нужно профилировать общие библиотеки? А как насчет трассировки системных вызовов?
Лично я использую oprofile для всего, что делаю, но это может быть не лучший выбор в каждом случае. Vtune и Shark тоже превосходны.
Мой единственный опыт профилирования кода C++ - это AQTime от AutomatedQA (теперь SmartBear Software). Он имеет несколько типов встроенных профилировщиков (производительность, память, дескрипторы Windows, трассировка исключений, статический анализ и т. д.) И инструментарий кода для получения результатов.
Мне нравилось пользоваться им - всегда было весело находить те места, где небольшое изменение в коде могло значительно улучшить производительность.
К сожалению, это работает только в Windows.
Раньше я широко использовал Код свечения, и у меня не было ничего, кроме положительного опыта. Его интеграция с Visual Studio действительно хороша, и это самый эффективный / интуитивно понятный профилировщик, который я когда-либо использовал (даже по сравнению с профилировщиками для управляемого кода).
Очевидно, что это бесполезно, если вы не работаете в Windows, но вопрос оставляет мне неясным, каковы ваши требования.
Для разработки под Linux (хотя некоторые из этих инструментов могут работать на других платформах). Это два громких имени, о которых я знаю, и множество других, более мелких, которые давно не разрабатывались.
Для Linux: Google Perftools
опрофайл, без сомнения; он простой, надежный, выполняет свою работу и может давать всевозможные подробные сведения о данных.
Я пробовал Quantify an AQTime, и Quantify победил благодаря своим бесценным функциям «сосредоточиться на поддереве» и «удалить поддерево».
Полный акк. Мне просто нужно было профилировать приложение C++, и это были именно те функции, которые действительно сделали мой день.
Единственный чувствительный ответ - ПТУ от Intel. Конечно, лучше всего использовать его на процессоре Intel и получить еще более ценные результаты, по крайней мере, на машине C2D, поскольку сама архитектура легче возвращает значимые профили.
Для Windows проверьте Xperf. Он использует образец профиля, имеет полезный пользовательский интерфейс и не требует инструментовки. Очень полезно для отслеживания проблем с производительностью. Вы можете ответить на такие вопросы, как:
Вы будете очень удивлены, когда найдете узкие места, поскольку они, вероятно, находятся не там, где вы ожидали!
Поскольку вы не упоминаете платформу, над которой работаете, я скажу cachegrind под Linux. Определенно. Это часть набора инструментов Valgrind.
http://valgrind.org/info/tools.html
Я никогда не использовал его вспомогательную функцию Callgrind, поскольку большая часть моего кода оптимизации предназначена для функций внутри.
Обратите внимание, что доступен внешний интерфейс KCachegrind.
Для разработки под Windows я использовал Валидатор производительности Software Verification - он быстрый, достаточно точный и недорогой. Еще лучше то, что он может инструментировать текущий процесс и позволяет вам включать и выключать сбор данных во время выполнения, как вручную, так и на основе стека вызовов, что отлично подходит для профилирования небольшого раздела более крупной программы.
Я много лет использовал VTune под Windows и Linux с очень хорошими результатами. Более поздние версии стали хуже, когда они передали этот продукт на аутсорсинг своей российской команде разработчиков, качество и производительность упали (увеличилось количество сбоев VTune, часто 15+ минут на открытие файла анализа).
Что касается инструментовки, вы можете обнаружить, что она менее полезна, чем вы думаете. В приложениях, над которыми я работал, добавление инструментовки часто настолько замедляет работу продукта, что он больше не работает (реальная история: запустить приложение, пойти домой, вернуться на следующий день, приложение все еще инициализируется). Кроме того, при профилировании без инструментов вы можете реагировать на текущие проблемы. Например, с помощью удаленного сборщика данных VTune я могу запустить сеанс выборки на реальном сервере с сотнями одновременных подключений, который испытывает проблемы с производительностью, и выявить проблемы, возникающие в производственной среде, которые я никогда не смогу воспроизвести в тестовой среде.
Для Windows я пробовал AMD Codeanalyst, Intel VTune и профилировщик в Visual Studio Team Edition.
Codeanalyst содержит ошибки (часто дает сбой), и в моем коде его результаты часто неточны. Его пользовательский интерфейс не интуитивно понятен. Например, чтобы отобразить стек вызовов в результатах профиля, вы должны щелкнуть вкладку «Процессы», затем щелкнуть имя EXE-файла вашей программы, затем щелкнуть кнопку панели инструментов с крошечными буквами «CSS» на ней. Но это бесплатное программное обеспечение, поэтому вы можете попробовать его, и оно работает (с меньшим количеством функций) без процессора AMD.
VTune (700 $) имеет IMO ужасный пользовательский интерфейс; в большой программе трудно найти конкретное дерево вызовов, которое вы хотите, и вы можете просматривать только один "узел" в программе за раз (функция с ее непосредственными вызывающими и вызываемыми объектами) - вы не можете просмотреть полное дерево звонков. Есть представление графа вызовов, но я не смог найти способ, чтобы относительное время выполнения отображалось на графике. Другими словами, функции на графике выглядят одинаково независимо от того, сколько времени в них было потрачено - как будто они полностью упустили точку профилирования.
Профилировщик Visual Studio имеет лучший графический интерфейс из трех, но по какой-то причине он не может собирать образцы из большей части моего кода (образцы собираются только для нескольких функций во всей моей программе на C++). Кроме того, я не мог найти цену или способ купить его напрямую; но он поставляется с подпиской MSDN моей компании. Visual Studio поддерживает управляемый, собственный и смешанный код; Я не уверен насчет двух других профилировщиков в этом отношении.
В заключение, я еще не знаю хорошего профилировщика! Я обязательно ознакомлюсь с другими предложениями здесь.
ElectricFence отлично работает для отладки malloc
ИМХО, выборка с помощью отладчика - лучший способ. Все, что вам нужно, это IDE или отладчик, позволяющий остановить программу. Он решает ваши проблемы с производительностью еще до того, как вы установили профилировщик.
Да! Это отлично работает для меня. Не требует инструментов. Он не требует установки профилировщика и т. д. В Linux вы можете использовать gdb. Программа работает на полной скорости. Нажмите ctrl-c, чтобы остановиться. введите «bt», чтобы отобразить трассировку стека. Затем нажмите c, чтобы продолжить, затем снова ctrl-c. Прекрасно работает! Я просто сократил время выполнения сложной программы на 20%, используя эту технику. Потрясающие!
@HughPerkins: Спасибо за редактирование, и я рад, что у вас все получилось. (Бьюсь об заклад, вы можете сделать лучше, чем 20% :)
Да, время итерации уменьшилось с 1200 мс до 200 мс, за несколько часов работы, используя только gdb + ctrl-c, чтобы найти горячие точки :-)
@HughPerkins: Для меня, если я работаю над своим собственным кодом, трудно понять, когда прекратить попытки - кажется, я всегда могу выжать еще немного. Когда я работаю над чужим кодом, может возникнуть проблема. Я не всегда могу убедить «владельца» кода исправить проблему, поэтому процесс останавливается. Это интересная головоломка.
Если вы просто хотите добиться этого без инструментов, вам не понадобится даже отладчик или IDE в Linux. Просто запустите "pstack
@ManishSogi: Вы правы. К сожалению, я давно не пользовался Linux. И на самом деле мне нравится смотреть не только на трассировку стека, например, что такое переменные, или выходить из любой подпрограммы, в которой я участвую, чтобы я мог лучше понять, что она делает и почему.
Я использую devpartner для платформы ПК.
Это инструментальный код. Он имеет покрытие кода и проверку границ (инструментальную и неинструментированную)
Профилировщик в Visual Studio 2008 очень хорош: быстрый, удобный, понятный и хорошо интегрированный в IDE.
Разве профилировщик не только в командной версии?
@dwj: Я не уверен. Я использую Visual Studio Team System 2008 Development Edition.
Похоже, это только в Team edition (stackoverflow.com/questions/61669/…) для версий до 2010.
Мой любимый инструмент - Easy Profiler: http://code.google.com/p/easyprofiler/
Это профилировщик времени компиляции: исходный код должен быть вручную инструментирован с использованием набора подпрограмм, чтобы описать целевые регионы. Однако после того, как приложение запущено и измерения автоматически записываются в файл XML, остается лишь открыть приложение Observer и сделать несколько щелчков мышью по инструментам анализа / сравнения, прежде чем вы сможете увидеть результат на качественной диаграмме.
Я никогда раньше не занимался профилированием. Вчера я запрограммировал класс ProfilingTimer со статическим расписанием (map<:string 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");
Эта строка немного громоздка для добавления во все функции, которые я хочу профилировать, поскольку мне нужно угадывать, какие функции занимают много времени. Но он работает хорошо, и функция печати показывает затраченное время в%.
(Кто-нибудь еще работает с подобным «самодельным профилированием»? Или это просто глупо? Но весело! Есть ли у кого-нибудь предложения по улучшению?
Есть ли какое-то автодобавление строчки ко всем функциям?)
Профайлер Visual Studio 2010 под Windows. У VTune был отличный инструмент для построения графиков вызовов, но он был сломан в Windows Vista / 7. Не знаю, исправили ли они это.
Позвольте мне предложить EQATEC ... именно то, что я искал ... простой в изучении и использовании, и дает мне информацию, необходимую для быстрого поиска горячих точек. Я предпочитаю его встроенному в Visual Studio (хотя, честно говоря, я еще не пробовал VS 2010).
Возможность делать снимки ОГРОМНАЯ. Я часто делаю дополнительный анализ и оптимизацию, ожидая запуска настоящего целевого анализа ... мне это нравится.
Да, и его базовая версия бесплатна!
http://www.eqatec.com/Profiler/
Вы хотите 1) измерить или вы хотите 2) найти ускорение? Если вы хотите 2 и думаете, что для этого требуется 1, это не так. Чтобы найти ускорение, вам не нужны «очень хорошие результаты». Если программа тратит 90% своего времени на то, что вы вполне могли бы удалить, если бы вы знали, что это было, образцы стека покажет вам это 9 раз из 10. Если вы посмотрите на 10 образцов, вас волнует, увидят ли вы это? 10 раз, 9 раз или 8 раз? В любом случае, вы знаю что это. Измеренный процент значения не имеет.