Ответ 1
Для разработки Linux (хотя некоторые из этих инструментов могут работать на других платформах). Это два больших имени, о которых я знаю, есть много других меньших, которые пока не видели активного развития.
До сих пор я использовал Rational Quantify. Я много слышал о Intel VTune, но никогда не пробовал!
Изменить: я в основном ищу программное обеспечение, которое будет обрабатывать код, поскольку я предполагаю, что о единственном способе получения очень хороших результатов.
Какие хорошие профилировщики для родного С++ в Windows?
Для разработки Linux (хотя некоторые из этих инструментов могут работать на других платформах). Это два больших имени, о которых я знаю, есть много других меньших, которые пока не видели активного развития.
Для Linux: Google Perftools
Только мой профилирующий код С++ с AQTime от AutomatedQA (теперь SmartBear Software). Он имеет несколько типов встроенных профилировщиков (производительность, память, дескрипторы Windows, трассировка исключений, статический анализ и т.д.), А также инструмент для получения результатов.
Мне понравилось использовать его - всегда было интересно найти те места, где небольшое изменение в коде может значительно улучшить производительность.
Я использовал Glowcode в прошлом и не имел ничего, кроме положительного опыта с ним. Интеграция с Visual Studio очень хорошая, и это самый эффективный/интуитивно понятный профайлер, который я когда-либо использовал (даже по сравнению с профайлерами для управляемого кода).
Очевидно, что это бесполезно, если вы не работаете в Windows, но вопрос оставляет для меня неясным, каковы ваши требования.
IMHO, выборка с использованием отладчика - лучший метод. Все, что вам нужно - это IDE или отладчик, который позволяет вам остановить программу. Это приводит к проблемам с производительностью до того, как вы даже установили профайлер.
Профилировщик в Visual Studio 2008 очень хорош: быстрый, удобный, понятный и хорошо интегрированный в IDE.
Я никогда не делал профилирования раньше. Вчера я запрограммировал класс ProfilingTimer со статическим расписанием (map < 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);
}
В каждой функции (или {block}), которую я хочу профилировать, мне нужно добавить:
ProfilingTimer _ProfilingTimer("identifier");
Эта строка немного громоздка, чтобы добавить все функции, которые я хочу профилировать, так как я должен угадать, какие функции занимают много времени. Но он работает хорошо, и функция печати показывает время, затраченное на%.
(Кто-нибудь еще работает с каким-либо подобным "домашним профилированием"? Или это просто глупо? Но это весело! У кого-нибудь есть предложения по улучшению?
Есть ли какое-то автоматическое добавление строки ко всем функциям?)
oprofile, без сомнения; его простой, надежный, выполняет эту работу и может давать всевозможные приятные разбивки данных.
В Windows зайдите в Xperf. Он использует выборочный профиль, имеет некоторый полезный интерфейс и не требует инструментов. Весьма полезно для отслеживания проблем с производительностью. Вы можете ответить на такие вопросы, как:
Вы будете очень удивлены, когда найдете узкие места, поскольку они, вероятно, не там, где вы ожидали!
Существуют различные требования к профилированию. Является ли инструментальный код в порядке, или вам нужно профилировать оптимизированный код (или даже уже скомпилированный код)? Вам нужна линейная информация профиля? Какую ОС вы используете? Вам также нужно профилировать общие библиотеки? Как насчет отслеживания в системных вызовах?
Лично я использую oprofile для всего, что я делаю, но это может быть не лучшим выбором в каждом случае. Vtune и Shark оба превосходны также.
Поскольку вы не упоминаете платформу, над которой работаете, я скажу cachegrind под Linux. Определенно. Это часть набора инструментов Valgrind.
http://valgrind.org/info/tools.html
Я никогда не использовал свою подфункцию Callgrind, так как большая часть моей оптимизации кода для внутренних функций.
Обратите внимание, что имеется доступный доступ к KCachegrind.
Для разработки Windows я использовал проверку программного обеспечения Performance Validator - это быстро, разумно точно и по разумной цене. Лучше всего, он может управлять запущенным процессом и позволяет включать и отключать сбор данных во время выполнения, как вручную, так и на основе callstack - отлично подходит для профилирования небольшого раздела более крупной программы.
Я использую devpartner для платформы pc.
Я попробовал Quantify AQTime, а Quantify выиграл из-за его неоцененных возможностей "сосредоточиться на поддереве" и "удалить вспомогательные деревья".
Единственным чувствительным ответом является PTU от Intel. Конечно, лучше всего использовать его на процессоре Intel и получить еще более ценные результаты, по крайней мере, на C2D-машине, поскольку самой архитектуре легче вернуть осмысленные профили.
Я использовал VTune под Windows и Linux в течение многих лет с очень хорошими результатами. Более поздние версии ухудшились, когда они передали этот продукт качеству и производительности своих российских разработчиков, а также снизились (увеличение числа сбоев VTune, часто 15 + минут, чтобы открыть файл анализа).
Что касается инструментария, вы можете узнать, что он менее полезен, чем вы думаете. В тех приложениях, в которых я работал над добавлением инструментов, часто замедляется работа продукта настолько, что он больше не работает (истинная история: начать приложение, вернуться домой, вернуться на следующий день, приложение все еще инициализирует). Кроме того, при отсутствии инструментального профилирования вы можете реагировать на живые проблемы. Например, с удаленным сборщиком дат VTune я могу запустить сеанс выборки на реальном сервере с сотнями одновременных подключений, которые испытывают проблемы с производительностью и ловят проблемы, которые происходят в процессе производства, которые я никогда не смогу реплицировать в тестовой среде.
В Windows я пробовал AMD Codeanalyst, Intel VTune и профилировщик Visual Studio Team Edition.
Codeanalyst работает с ошибкой (часто происходит сбой), а в моем коде результаты часто неточны. Его пользовательский интерфейс неинтуитивный. Например, чтобы достичь отображения стека вызовов в результатах профиля, вам нужно щелкнуть вкладку "Процессы", затем щелкнуть имя файла EXE вашей программы, а затем нажать кнопку на панели инструментов с помощью крошечных букв "CSS". Но это бесплатная программа, поэтому вы можете попробовать и работать (с меньшим количеством функций) без процессора AMD.
VTune ($ 700) имеет ужасный пользовательский интерфейс IMO; в большой программе трудно найти нужное дерево вызовов, и вы можете смотреть только на один "node" в программе за раз (функция со своими непосредственными вызывающими и вызываемыми абонентами) - вы не можете смотреть на полное дерево вызовов. Существует представление графика вызовов, но я не мог найти способ сделать относительное время выполнения отображаемым на графике. Другими словами, функции на графике выглядят одинаково независимо от того, сколько времени было потрачено на них - как будто они полностью пропустили точку профилирования.
Профилировщик Visual Studio имеет лучший графический интерфейс для трех, но по какой-то причине он не может собирать образцы из большинства моего кода (образцы собираются только для нескольких функций во всей моей программе на С++). Кроме того, я не мог найти цену или способ купить ее напрямую; но он поставляется с моей подписью MSDN. Visual Studio поддерживает управляемый, родной и смешанный код; Я не уверен в двух других профилировщиках в этом отношении.
В заключение я пока не знаю хорошего профилировщика! Я обязательно рассмотрю другие предложения здесь.
ElectricFence отлично работает для отладки malloc
Моим любимым инструментом является Easy Profiler: http://code.google.com/p/easyprofiler/
Это профайлер времени компиляции: исходный код должен быть ручным инструментом, используя набор подпрограмм, чтобы описать целевые регионы. Однако, как только приложение запускается и автоматически записывается в файл XML, это только вопрос открытия приложения Observer и несколько щелчков по инструментам анализа/сравнения, прежде чем вы сможете увидеть результат в качественной диаграмме.
Профайлер Visual Studio 2010 под Windows. У VTune был отличный инструмент графика звонков, но он был сломан как Windows Vista/7. Я не знаю, исправили ли они это.
Позвольте мне дать вилку для EQATEC... только то, что я искал... просто узнать и использовать, и дает мне информацию, необходимую для быстрого поиска горячих точек. Я очень предпочитаю его встроенной в Visual Studio (хотя я еще не пробовал VS 2010, если честно).
Возможность делать снимки ОГРОМНЫ. Я часто получаю дополнительный анализ и оптимизацию, ожидая выполнения реального целевого анализа... люблю его.
О, и его базовая версия бесплатна!
http://www.eqatec.com/Profiler/