Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Для профилирования в Windows вы можете использовать LProf.Дешево, но не здорово: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 или видео, которое работает по таймеру и должно быть быстрым.Предположим, что на каждом такте таймера вы запускаете подпрограмму А.Напишите какой-нибудь тестовый код для запуска подпрограммы А в простом цикле, скажем, 1000 раз или достаточно долго, чтобы заставить вас ждать хотя бы несколько секунд.

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

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

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

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

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

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

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

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

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

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

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

нПроф - Бесплатно, делает это для .NET.

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

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

Джава:я фанат JПрофилер.Опять же, может работать автономно или как плагин Eclipse (или других IDE).

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

А Google Перфтулс чрезвычайно полезны в этом отношении.

я использую партнер-разработчик с MSVC 6 и XP

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top