Как вы профилируете свой код? - PullRequest
9 голосов
/ 11 сентября 2008

Надеюсь, не все используют Rational Purify.

Итак, что вы делаете, когда хотите измерить:

  • время, затраченное функцией
  • пиковое использование памяти
  • покрытие кода

На данный момент мы делаем это вручную [используя операторы журнала с метками времени и другой скрипт для анализа журнала и вывода в Excel. уф ...)

Что бы вы порекомендовали? Будем благодарны за указание инструментов или любых методов!

РЕДАКТИРОВАТЬ: Извините, сначала я не указал среду, Его простой C на проприетарном мобильном платформа

Ответы [ 9 ]

6 голосов
/ 05 ноября 2008

Я сделал это много. Если у вас есть IDE или ICE, есть метод , который требует ручного усилия, но работает без сбоев.

Предупреждение: современные программисты ненавидят это, и я собираюсь понизиться. Они любят свои инструменты. Но это действительно работает, и у вас не всегда есть хорошие инструменты.

Я предполагаю, что в вашем случае код является чем-то вроде DSP или видео, которое работает по таймеру и должно быть быстрым. Предположим, что вы запускаете на каждом такте таймера подпрограмму A. Напишите некоторый тестовый код для запуска подпрограммы A в простом цикле, скажем 1000 раз или достаточно долго, чтобы заставить вас ждать не менее нескольких секунд.

Пока он работает, случайным образом остановите его клавишей паузы, сэмплируйте стек вызовов (а не только счетчик программы) и запишите его. (Это часть руководства.) Делайте это несколько раз, например, 10. Одного раза недостаточно.

Теперь ищите сходства между образцами стека. Ищите любую инструкцию или инструкцию вызова, которая появляется по крайней мере на 2 образцах. Их будет много, но некоторые будут в коде, который вы могли бы оптимизировать.

Сделайте это, и вы получите хорошее ускорение, гарантированное. 1000 итераций займут меньше времени.

Причина, по которой вам не нужно много образцов, заключается в том, что вы не ищете мелочи. Например, если вы видите конкретную инструкцию вызова на 5 из 10 выборок, она отвечает примерно за 50% общего времени выполнения. Больше образцов скажут вам более точно, каков процент, если вы действительно хотите знать. Если вы похожи на меня, все, что вы хотите знать, это где оно находится, так что вы можете исправить это и перейти к следующему.

Делайте это до тех пор, пока вы не сможете найти что-то еще для оптимизации, и вы достигнете максимальной скорости или приблизитесь к ней.

3 голосов
/ 11 сентября 2008

Возможно, вам нужны различные инструменты для профилирования производительности и покрытия кода.

Для профилирования я предпочитаю Shark на MacOSX. Это бесплатно от Apple и очень хорошо. Если ваше приложение - vanilla C, вы сможете использовать его, если сможете достать Mac.

Для профилирования в Windows вы можете использовать LTProf. Дешево, но не здорово http://successfulsoftware.net/2007/12/18/optimising-your-application/

(Я думаю, что Microsoft действительно стреляет себе в ногу, не предоставив достойного профилировщика более дешевым версиям Visual Studio.)

Для покрытия я предпочитаю Coverage Validator на Windows: http://successfulsoftware.net/2008/03/10/coverage-validator/ Обновляет покрытие в режиме реального времени.

3 голосов
/ 11 сентября 2008

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

К сожалению, это не годится для .net или java, поскольку у Vtune нет способа отобразить указатель инструкции на символ, как в традиционном коде.

Он также позволяет измерять все виды других метрик, ориентированных на процессор / аппаратное обеспечение, таких как тактовые импульсы на команду, попадания / пропадания кэша, попадания / пропадания TLB и т. Д., Которые позволяют вам определить, почему выполнение определенных разделов кода может занять больше времени чем вы ожидаете, просто проверяя код.

2 голосов
/ 11 сентября 2008

Если вы делаете «на металле» встроенную «C» систему (я не совсем уверен, что «мобильный» подразумевается в вашей публикации), то у вас обычно есть какой-то таймер ISR, в котором он довольно легко сэмплировать кодовый адрес, по которому произошло прерывание (копаясь в стеке или просматривая регистры ссылок или что-то еще). Тогда тривиально построить гистограмму адресов при некоторой комбинации гранулярности / диапазона интересов.

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

Если вы сильно ограничены в ОЗУ, может быть немного сложно собрать достаточно данных, чтобы они были простыми и полезными, но вам нужно будет рассказать нам больше о вашей платформе.

1 голос
/ 11 сентября 2008

nProf - бесплатно, делает это для .NET.

Получает выполненную работу, по крайней мере, достаточно, чтобы увидеть 80/20. (20% кода, занимает 80% времени)

0 голосов
/ 16 сентября 2008

Я использую devpartner с MSVC 6 и XP

0 голосов
/ 12 сентября 2008

Как будут работать любые инструменты, если ваша платформа является проприетарной ОС? Я думаю, что вы делаете все возможное, что вы можете прямо сейчас

0 голосов
/ 12 сентября 2008

Google Perftools чрезвычайно полезны в этом отношении.

0 голосов
/ 11 сентября 2008

Windows (.NET и Native Exes): AQTime - отличный инструмент для денег. Автономный или как плагин для Visual Studio.

Java: я фанат JProfiler . Опять же, может работать автономно или в виде плагина Eclipse (или различных других IDE).

Я считаю, что у обоих есть пробные версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...