Как вы профилируете свой код?

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

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

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

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

Что ты посоветуешь? Приветствуется указание на инструменты или любые методы!

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
11 053
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

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

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

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

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

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

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

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

Ответ принят как подходящий

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

Для профилирования я предпочитаю Shark на MacOSX. Это бесплатно от Apple и очень хорошо. Если у вас ванильное приложение 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/ Он обновляет покрытие в режиме реального времени.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по теме