Как вы профилируете свой код?
Я надеюсь, что не все используют Rational Purify.
Итак, что вы делаете, когда хотите измерить:
- время, затраченное на функцию
- пиковое использование памяти
- покрытие кода
На данный момент мы делаем это вручную [используя операторы журнала с метками времени и другой скрипт для анализа журнала и вывода в Excel. уф...)
Чтобы вы посоветовали? Указание на инструменты или любые методы будут оценены!
РЕДАКТИРОВАТЬ: Извините, я не указал среду в первую очередь, его простой C на проприетарной мобильной платформе
9 ответов
Возможно, вам нужны разные инструменты для профилирования производительности и покрытия кода.
Для профилирования я предпочитаю 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/ Он обновляет покрытие в режиме реального времени.
Я сделал это много. Если у вас есть IDE или ICE, есть метод, который требует некоторых ручных усилий, но работает без сбоев.
Предупреждение: современные программисты ненавидят это, и я собираюсь понизиться. Они любят свои инструменты. Но это действительно работает, и у вас не всегда есть хорошие инструменты.
Я предполагаю, что в вашем случае код является чем-то вроде DSP или видео, которое работает по таймеру и должно быть быстрым. Предположим, что вы запускаете на каждом такте таймера подпрограмму A. Напишите некоторый тестовый код для запуска подпрограммы A в простом цикле, скажем 1000 раз или достаточно долго, чтобы заставить вас ждать не менее нескольких секунд.
Пока он работает, случайным образом остановите его с помощью клавиши паузы, сэмплируйте стек вызовов (а не только счетчик программы) и запишите его. (Это часть руководства.) Делайте это несколько раз, например, 10. Одного раза недостаточно.
Теперь поищите сходство между образцами стека. Ищите любую инструкцию или инструкцию вызова, которая появляется по крайней мере на 2 образцах. Их будет много, но некоторые из них будут в коде, который вы можете оптимизировать.
Сделайте это, и вы получите хорошее ускорение, гарантированное. 1000 итераций займут меньше времени.
Причина, по которой вам не нужно много образцов, заключается в том, что вы не ищете мелочи. Например, если вы видите конкретную инструкцию вызова на 5 из 10 выборок, она отвечает примерно за 50% общего времени выполнения. Больше образцов скажут вам более точно, каков процент, если вы действительно хотите знать. Если вы похожи на меня, все, что вы хотите знать, это где это находится, так что вы можете исправить это и перейти к следующему.
Делайте это до тех пор, пока не сможете найти что-то еще для оптимизации, и вы достигнете максимальной скорости или приблизитесь к ней.
Для сложных приложений я большой поклонник Intel Vtune. Это немного другое мышление по сравнению с традиционным профилировщиком, который использует код. Он работает путем выборки процессора, чтобы увидеть, где указатель команды равен 1000 раз в секунду. Он имеет огромное преимущество: он не требует каких-либо изменений в ваших двоичных файлах, что часто меняет время, которое вы пытаетесь измерить.
К сожалению, это не годится для.net или java, поскольку у Vtune нет способа отобразить указатель инструкции на символ, как в традиционном коде.
Это также позволяет вам измерять все виды других метрик, ориентированных на процессор / оборудование, таких как тактирование на команду, попадания / пропадания кэша, попадания / пропадания TLB и т. Д., Которые позволяют вам определить, почему выполнение определенных разделов кода может занять больше времени, чем вы ожидать, просто проверяя код.
Если вы используете встроенную C-систему "на металле" (я не совсем уверен, что подразумевается под "мобильным" в вашей публикации), то у вас обычно есть какой-то таймер ISR, в котором довольно легко сэмплировать кодовый адрес, по которому произошло прерывание (копаясь обратно в стеке или просматривая регистры связи или что-то еще). Тогда тривиально построить гистограмму адресов при некоторой комбинации гранулярности / диапазона интересов.
В таком случае обычно не сложно составить некоторую комбинацию кодов / сценариев / листов Excel, которая объединяет количество ваших гистограмм с адресами из файла символов / списков компоновщика, чтобы предоставить вам информацию профиля.
Если у вас очень мало оперативной памяти, может быть немного сложно собрать достаточно данных, чтобы они были простыми и полезными, но вам нужно рассказать нам больше о вашей платформе.
nProf - бесплатно, делает это для.NET.
Получает работу, по крайней мере, достаточно, чтобы увидеть 80/20. (20% кода, занимая 80% времени)
Как будут работать любые инструменты, если ваша платформа является проприетарной ОС? Я думаю, что вы делаете лучшее, что можете прямо сейчас