Как вы профилируете свой код?
Я надеюсь, что не все используют Rational Purify.
Итак, что вы делаете, когда хотите измерить:
- время, выполняемое функцией
- Использование пиковой памяти
- охват кода
В настоящий момент мы делаем это вручную [используя инструкции журнала с отметками времени и еще один script для синтаксического анализа журнала и вывода на Excel. уф...)
Что бы вы порекомендовали? Указание на инструменты или любые методы будут оценены!
РЕДАКТИРОВАТЬ: Извините, я не указал среду в первую очередь, ее простой C на собственной мобильной платформе
Ответы
Ответ 1
Вероятно, вам нужны различные инструменты для профилирования производительности и покрытия кода.
Для профилирования я предпочитаю Shark на MacOSX. Он свободен от Apple и очень хорош. Если ваше приложение - ваниль C, вы сможете использовать его, если сможете получить Mac.
Для профилирования в Windows вы можете использовать LTProf. Дешево, но не здорово:
http://successfulsoftware.net/2007/12/18/optimising-your-application/
(Я думаю, что Microsoft действительно стреляет в ногу, не предоставляя достойный профилировщик с более дешевыми версиями Visual Studio.)
Для покрытия я предпочитаю средство проверки покрытия в Windows:
http://successfulsoftware.net/2008/03/10/coverage-validator/
Он обновляет покрытие в режиме реального времени.
Ответ 2
Я сделал это много. Если у вас есть IDE или ICE, есть техника, которая требует некоторого ручного усилия, но работает без сбоев.
Предупреждение: современные программисты ненавидят это, и я собираюсь получить downvoted. Они любят свои инструменты. Но это действительно работает, и у вас не всегда есть хорошие инструменты.
Я предполагаю, что в вашем случае код - это нечто вроде DSP или видео, которое работает по таймеру и должно быть быстрым. Предположим, что вы выполняете на каждом тике таймера подпрограмму A. Напишите некоторый тестовый код для запуска подпрограммы A в простой цикл, скажем 1000 раз, или достаточно долго, чтобы заставить вас ждать не менее нескольких секунд.
Пока он работает, произвольно остановите его с помощью клавиши паузы и попробуйте стек вызовов (а не только счетчик программ) и запишите его. (Это ручная часть.) Делайте это несколько раз, например 10. Один раз недостаточно.
Теперь найдите общие черты между образцами стека. Ищите любую инструкцию или инструкцию по вызову, которая появляется не менее чем по 2 образцам. Их будет много, но некоторые из них будут в коде, который вы могли бы оптимизировать.
Сделайте так, и вы получите хорошее ускорение, гарантированное. 1000 итераций займет меньше времени.
Причина, по которой вам не нужно много образцов, вы не ищете мелочей. Например, если вы видите конкретную инструкцию вызова на 5 из 10 образцов, она отвечает примерно за 50% от общего времени выполнения. Больше образцов расскажет вам более точно, что такое процент, если вы действительно хотите знать. Если вы похожи на меня, все, что вы хотите знать, это то, где оно есть, поэтому вы можете исправить это и перейти к следующему.
Сделайте это до тех пор, пока вы не сможете найти что-то еще для оптимизации, и вы будете находиться на максимальной скорости или близки к ней.
Ответ 3
Для сложных приложений я большой поклонник Intel Vtune. Это немного отличается от традиционного профилировщика, который использует код. Он работает путем выборки процессора, чтобы увидеть, где указатель инструкции 1000 раз в секунду. Это имеет огромное преимущество, не требуя каких-либо изменений в ваших двоичных файлах, что так часто, как не изменило бы сроки того, что вы пытаетесь измерить.
К сожалению, это не хорошо для .net или java, так как Vtune не может сопоставить указатель на символ, похожий на традиционный код.
Он также позволяет измерять всевозможные другие показатели производительности процессора/оборудования, такие как часы на инструкцию, удары/пропуски кеша, пропуски/пропуски TLB и т.д., которые позволяют вам определить, почему некоторые разделы кода могут занимать больше времени для запуска чем вы ожидали бы, просто проверив код.
Ответ 4
Если вы делаете "встроенную" встроенную систему "C" (я не совсем уверен, что означает "мобильный" в вашей публикации), тогда у вас обычно есть какой-то таймер ISR, в котором он справедливо легко пробовать код кодового адреса, на котором произошло прерывание (выкапывание в стеке или просмотр регистров ссылок или что-то еще). Тогда тривиально построить гистограмму адресов при некотором сочетании гранулярности/диапазона интересов.
Обычно не сложно собрать какую-либо комбинацию листов кода / script/Excel, которая объединяет ваши счета гистограмм с адресами из вашего символьного/спискового файла компоновщика, чтобы предоставить вам информацию о профиле.
Если вы ограничены в ОЗУ, может быть немного больно собрать достаточно данных, чтобы это было простым и полезным, но вам нужно будет рассказать нам больше о вашей платформе.
Ответ 5
nProf - бесплатно, это для .NET.
Получает выполненную работу, по крайней мере, достаточно, чтобы увидеть 80/20. (20% кода, принимая 80% времени)
Ответ 6
Windows (.NET и Native Exes): AQTime - отличный инструмент для денег. Автономный или как плагин Visual Studio.
Java: Я поклонник JProfiler. Опять же, можно запустить автономный или как плагин Eclipse (или другой другой IDE).
Я считаю, что у обоих есть пробные версии.
Ответ 7
Google Perftools чрезвычайно полезны в этом отношении.
Ответ 8
Я использую devpartner с MSVC 6 и XP
Ответ 9
Как будут работать какие-либо инструменты, если ваша платформа является собственной ОС? Я думаю, что вы делаете все возможное прямо сейчас.