2008-09-11 2 views
7

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

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

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

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

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

EDIT: К сожалению, я не уточнял среду первой, Его обычная C на собственной мобильной платформе

ответ

3

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

Для профилирования я предпочитаю 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/ Он обновляет покрытие в режиме реального времени.

1

nProf - Free, делает это для .NET.

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

0

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

Java: Я - фанат JProfiler. Опять же, можно запускать автономный или как плагин Eclipse (или другой другой IDE).

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

3

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

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

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

2

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

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

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

-1

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

6

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

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

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

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

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

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

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

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

Смежные вопросы