За пределами выборки стека: C ++ Profilers - PullRequest
141 голосов
/ 09 декабря 2010

История хакера

Дата 12/02/10. Проходят дни перед Рождеством, и я, в основном, работаю Windows-программистом. Я использовал AQTime, я пробовал сонный, блестящий и очень сонный, и, как мы говорим, VTune устанавливает. Я пытался использовать профилировщик VS2008, и это было как положительно, так и часто незаметно. Я использовал технику случайной паузы. Я исследовал деревья вызовов. Я запустил функциональные следы. Но печальный и болезненный факт заключается в том, что приложение, с которым я работаю, содержит более миллиона строк кода и, возможно, еще миллион строк сторонних приложений.

Мне нужны лучшие инструменты. Я прочитал другие темы. Я опробовал все профилировщики, перечисленные в каждой теме. Просто должно быть что-то лучшее, чем эти неопрятные и дорогие варианты, или смехотворное количество работы почти без выгоды. Чтобы еще больше усложнить ситуацию, наш код сильно загружен и запускает несколько циклов Qt Event, некоторые из которых настолько хрупки, что из-за задержек синхронизации вылетают из-за тяжелых инструментов. Не спрашивайте меня, почему мы запускаем несколько циклов событий. Никто не может сказать мне.

Есть ли еще какие-либо варианты в духе Valgrind в среде Windows?
Есть ли что-нибудь лучше, чем длинная полоса сломанных инструментов, которые я уже пробовал?
Есть ли что-то, предназначенное для интеграции с Qt, возможно, с полезным отображением событий в очереди?

Полный список инструментов, которые я пробовал, и те, которые были действительно полезны курсивом:

  • AQTime: Довольно хорошо! Есть некоторые проблемы с глубокой рекурсией, но в этих случаях граф вызовов верен и может быть использован для устранения любой путаницы, которая может возникнуть. Не идеальный инструмент, но стоит попробовать. Это может удовлетворить ваши потребности, и, конечно, большую часть времени мне было достаточно.
  • Атака случайной паузой в режиме отладки: Недостаточно информации достаточно времени.
    Хороший инструмент, но не полное решение.
  • Параллельные студии: Ядерный вариант. Навязчивый, странный и безумно мощный. Я думаю, что вы должны провести 30-дневную оценку и выяснить, подходит ли она вам. Это тоже чертовски круто.
  • AMD Codeanalyst: Замечательный, простой в использовании, очень подверженный сбоям, но я думаю, что это вещь окружающей среды. Я бы порекомендовал попробовать, так как это бесплатно.
  • Люк Стакуокер: Отлично работает на небольших проектах, немного пытается заставить его работать на наших. Хотя некоторые хорошие результаты, и он определенно заменяет Сонный для моих личных задач.
  • PurifyPlus: Нет поддержки сред Win-x64, особенно Windows 7. В остальном отлично. Ряд моих коллег из других отделов клянутся этим.
  • VS2008 Profiler: Производит вывод в диапазоне 100+ гигов в режиме функциональной трассировки с требуемым разрешением. С положительной стороны, дает хорошие результаты.
  • GProf: Требует, чтобы GCC был даже умеренно эффективным.
  • VTune: поддержка VT7 W7 граничит с криминалом. В остальном отлично
  • PIN-код: мне нужно взломать мой собственный инструмент, так что это своего рода последнее средство.
  • Sleepy \ VerySleepy: Полезно для небольших приложений, но меня здесь не хватает.
  • EasyProfiler: Неплохо, если вы не возражаете против небольшого количества кода, введенного вручную, чтобы указать, где инструмент.
  • Valgrind: * только nix, но очень хорошо, когда вы находитесь в этой среде.
  • OProfile: только для Linux.
  • Профи: Они стреляют в диких лошадей.

Предлагаемые инструменты, которые я не пробовал:

  • XPerf:
  • Glowcode:
  • Девпартнер:

Примечания: Среда Intel на данный момент. VS2008, буст библиотеки. Qt 4+. И жалкий скандал всех их: интеграция Qt / MFC через trolltech. <Ч /> Сейчас: Спустя почти две недели, похоже, моя проблема решена. Благодаря множеству инструментов, включая почти все в списке и пару моих личных приемов, мы нашли основные узкие места. Тем не менее, я собираюсь продолжать тестировать, исследовать и опробовать новые профилировщики, а также новые технологии. Зачем? Потому что я в долгу перед вами, ребята, потому что вы, ребята, молодцы. Это немного замедляет сроки, но я все еще очень рад продолжать пробовать новые инструменты.

Синопсис
Среди многих других проблем ряд компонентов был недавно переключен на неправильную модель многопоточности, вызывая серьезные зависания из-за того, что код под нами внезапно перестал быть многопоточным. Я не могу сказать больше, потому что это нарушает мой NDA, но я могу сказать вам, что это никогда не было бы обнаружено при случайной проверке или даже при обычном просмотре кода. Без профилировщиков, графов вызовов и случайной паузы в соединении мы все равно будем кричать от ярости на красивой синей дуге неба. К счастью, я работаю с некоторыми из лучших хакеров, которых я когда-либо встречал, и у меня есть доступ к удивительному стиху, полному замечательных инструментов и замечательных людей.

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

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

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

<ч /> Более длинный вид
Итак, я подумал, что было бы неплохо написать небольшую ретроспективу. Я решил активно работать с Parallel Studios, отчасти потому, что он фактически построен на основе инструмента PIN. Имея академические отношения с некоторыми из вовлеченных исследователей, я чувствовал, что это, вероятно, знак некоторого качества. К счастью, я был прав. Хотя графический интерфейс немного ужасен, я обнаружил, что IPS невероятно полезен, хотя я не могу с комфортом рекомендовать его всем. Крайне важно, что нет очевидного способа получить количество попаданий на уровне строки, что предоставляют AQT и ряд других профилировщиков, и я нашел очень полезным для изучения скорости выбора веток среди прочего. В сети мне также нравилось использовать AQTime, и я нашел их поддержку очень отзывчивой. Опять же, я должен уточнить мою рекомендацию: многие их функции работают не так хорошо, а некоторые из них прямо подвержены сбоям на Win7x64. XPerf также работает превосходно, но мучительно медленно для деталей выборки, необходимых для получения хорошего чтения на определенных видах приложений.

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

Ответы [ 19 ]

2 голосов
/ 16 декабря 2010

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

a) AMD Code Analyst

  • Это просто и даст вам быстрый обзор того, что происходит.В большинстве случаев это будет нормально.
  • С процессорами AMD он сообщит вам информацию о конвейере процессора, но вам это нужно только в том случае, если у вас есть большие циклы, как в графических движках, видеокодеках,и т. д.

b) VTune.

  • Он очень хорошо интегрирован в vs2008

  • после того, как вы знаетегорячих точек, вам нужно отобрать не только время, но и другие вещи, такие как ошибки кэша и использование памяти.Это очень важно .Настройте сеанс выборки и измените свойства.Я всегда проверяю время, чтение / запись памяти и ошибки кэша (три разных прогона)

Но больше, чем инструмент, вам нужно получить опыт работы с профилированием.И это означает понимание того, как работает CPU / Memory / PCI ... так что это мой третий вариант

c) Модульное тестирование

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

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

2 голосов
/ 15 декабря 2010

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

Вы можете использовать Пин для более точной детализации кода. Я думаю, что Pin позволит вам создать инструмент для подсчета того, сколько раз вы вводите функцию или сколько часов вы тратите там, грубо эмулируя что-то вроде VTune или CodeAnalyst. Затем вы могли бы урезать, какие функции инструментированы до тех пор, пока не исчезнут проблемы с синхронизацией.

1 голос
/ 07 апреля 2016

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

В Qt все вызовы слотов сигналов между потоками доставляются через цикл событий, как и таймеры, уведомления о сети и последовательном порту,все взаимодействие с пользователем.Таким образом, наблюдение за циклами событий - это большой шаг к пониманию того, где приложение тратит свое время.

1 голос
/ 03 декабря 2014

Я использую xperf / ETW для всех своих профилирующих потребностей.У него крутая кривая обучения, но он невероятно мощный.Если вы выполняете профилирование в Windows, вы должны знать xperf.Я часто использую этот профилировщик, чтобы находить проблемы с производительностью в моем коде и в коде других людей.

В конфигурации, в которой я его использую:

  • xperf извлекает образцы ЦП из каждого ядра, которое являетсявыполнение кода каждую мс.Частота дискретизации может быть увеличена до 8 кГц, и выборки включают режим пользователя и код ядра.Это позволяет выяснить, что делает поток во время его работы
  • xperf записывает каждый переключатель контекста (что позволяет идеально реконструировать, сколько времени использует каждый поток), плюс стеки вызовов для того, когда потоки включены, плюс вызовстеки для какого потока подготовили другой поток, позволяя отслеживать цепочки ожидания и выяснять, почему поток не выполняется
  • xperf записывает все операции ввода-вывода файлов из всех процессов
  • xperf записывает все операции ввода-вывода дискаO из всех процессов
  • xperf записывает, какое окно активно, частота процессора, состояние питания процессора, задержки пользовательского интерфейса и т. Д.
  • xperf также может записывать все выделения кучи из одного процесса, все виртуальные выделенияиз всех процессов и многое другое.

Это много данных, все на одной временной шкале, для всех процессов.Никакой другой профилировщик в Windows не может этого сделать.

Я много писал о том, как использовать xperf / ETW.Эти сообщения в блоге и некоторые обучающие видео профессионального качества можно найти здесь: http://randomascii.wordpress.com/2014/08/19/etw-training-videos-available-now/

Если вы хотите узнать, что может произойти, если вы не используете xperf, прочитайте эти сообщения в блоге: http://randomascii.wordpress.com/category/investigative-reporting/ Это рассказы о проблемах с производительностью, которые я обнаружил в коде других людей, которые должны были найти разработчики.Это включает в себя загрузку mshtml.dll в компилятор VC ++, отказ в обслуживании в файлах поиска в файлах VC ++, термическое регулирование на удивительном количестве компьютеров пользователей, медленный пошаговый переход в Visual Studio, выделение 4 ГБ в жесткомдрайвер диска, ошибка производительности PowerPoint и многое другое.

1 голос
/ 23 апреля 2014

Я только что закончил первую пригодную для использования версию CxxProf , переносимой библиотеки с ручным профилированием для C ++.

Он выполняет следующие цели:

  • Простая интеграция
  • Легко удаляет библиотеку во время компиляции
  • Легко удаляет библиотеку во время выполнения
  • Поддержка многопоточных приложений
  • Поддержка распределенных систем
  • Держите удар по минимуму

Эти точки были извлечены из проекта wiki , посмотрите там более подробную информацию.

Отказ от ответственности: я главный разработчик CxxProf

0 голосов
/ 23 ноября 2018

Я использую Orbit Profiler, легкий, открытый и мощный!https://orbitprofiler.com/

0 голосов
/ 04 января 2011

Здесь перечислены многие профилировщики, и я сам попробовал несколько из них - однако в итоге я написал свой собственный, основываясь на этом:

http://code.google.com/p/high-performance-cplusplus-profiler/

Это, конечно, требует, чтобы вы изменили базу кода, но она идеально подходит для сужения узких мест, должна работать на всех x86 (может быть проблема с многоядерными блоками, то есть используется rdtsc, однако - это чисто в любом случае ориентировочное время - так что я нахожу его достаточным для моих нужд ..)

0 голосов
/ 17 декабря 2010

хотя ваша ОС - win7, программа не может работать под xp? как насчет профиля под xp, и результат должен быть подсказкой для win7.

0 голосов
/ 12 декабря 2010

DevPartner, первоначально разработанный NuMega и теперь распространяемый MicroFocus, когда-то был предпочтительным решением для профилирования и анализа кода (например, утечки памяти и ресурсов).Я не пробовал это недавно, поэтому не могу заверить вас, что это поможет вам;но когда-то у меня были отличные результаты, так что это альтернатива, которую я действительно рассматриваю, чтобы переустановить в нашем процессе качества кода (они обеспечивают 14-дневную пробную версию)

...