Анализ производительности программ на C ++ [закрыт]

Как измерить производительность моих программ на C ++ с помощью C ++?

Определенные показатели, которые я хочу измерить:

  • Используемая память ( пробел )
  • Продолжительность ( время )
1 голос | спросил A T 14 AMpSat, 14 Apr 2012 10:53:35 +040053Saturday 2012, 10:53:35

7 ответов


5

Для профилирующей стороны вещей, если вы используете GNU, вы можете использовать gprof. Это даст вам следующие результаты:

Каждый образец считается равным 0,01 секунды.

  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 33.34      0.02     0.02     7208     0.00     0.00  open
 16.67      0.03     0.01      244     0.04     0.12  offtime
 16.67      0.04     0.01        8     1.25     1.25  memccpy
 16.67      0.05     0.01        7     1.43     1.43  write
 16.67      0.06     0.01                             mcount
  0.00      0.06     0.00      236     0.00     0.00  tzset
  0.00      0.06     0.00      192     0.00     0.00  tolower
  0.00      0.06     0.00       47     0.00     0.00  strlen
  0.00      0.06     0.00       45     0.00     0.00  strchr
  0.00      0.06     0.00        1     0.00    50.00  main
  0.00      0.06     0.00        1     0.00     0.00  memcpy
  0.00      0.06     0.00        1     0.00    10.11  print
  0.00      0.06     0.00        1     0.00     0.00  profil
  0.00      0.06     0.00        1     0.00    50.00  report

Ссылка на данные

Отличная вещь в том, что он имеет все функции в системе, которые вы трассируете, чтобы получить точное представление о том, какую функцию посмотреть.

ответил barrem23 14 PMpSat, 14 Apr 2012 20:22:05 +040022Saturday 2012, 20:22:05
4

В течение продолжительности (времени) я также использовал профилировщик. Однако, если вы хотите отслеживать некоторые методы, в частности, я использовал трюк определения небольшого таймер , который запускает таймер в конструкторе и останавливает его в деструктор. Тогда вам нужно всего лишь определить локальную переменную таймера в начале методов, которые вы хотите настроить, например:

MyClass::myMethod()
{
    MyTimer timer("MyClass::myMethod");

    ...
}

Деструктор переменной таймера будет записывать имя метода и длительность при выходе из метода.

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

Только мои 2 цента.

ответил Giorgio 14 PMpSat, 14 Apr 2012 18:32:55 +040032Saturday 2012, 18:32:55
2

Я согласен с Pubby в том, что лучше использовать профилирование с использованием внешних инструментов. Вот несколько указателей:

Чтобы получить приблизительную оценку времени выполнения исполняемого файла, я бы использовал инструмент linux, например time. Запуск исполняемого кода spam как:

time spam

Дает вам отзывы о том, сколько времени прошло. Вы также можете написать небольшой скрипт Python, который делает это несколько раз и усредняет результаты. См. этот поток SO . для некоторых подсказок, как измерять память, используемую приложением.

Но это дает только кумулятивный вид вашей программы. Намного интереснее разбить этот анализ на разные части вашего кода. Вы можете сделать это, профилировав свой код, например, используя GNU профайлер gprof. Это покажет вам, сколько времени потрачено на части кода. Это может дать вам представление о том, где вы могли бы потратить больше времени на оптимизацию, и где производительность кода не очень важна.

ответил Paul Hiemstra 14 AMpSat, 14 Apr 2012 11:06:54 +040006Saturday 2012, 11:06:54
2
  

Как измерить производительность моих программ на C ++ с помощью C ++?

Это очень плохая идея, потому что для этого уже есть инструменты.

В linux существует time для измерения времени, используемого приложением.

Также в linux вы можете использовать массив , который является профилиром кучи .

ответил BЈовић 14 AMpSat, 14 Apr 2012 11:12:17 +040012Saturday 2012, 11:12:17
2

Для измерения пространства я буду откладывать другие ответы.

В течение времени, я должен спросить, вы измеряете только потому, что хотите измерить, или потому, что хотите сделать программу меньше времени ?

Я только спрашиваю, потому что измерение времени, даже отдельных функций, не говорит о том, что вы должны исправить, чтобы заставить его работать быстрее. Он может сказать вам, где вы не должны выглядеть (т. Е. Функции с низким процентом процента), но это не говорит вам, где вы должны сосредоточиться. Для этого здесь метод, который я использую .

ответил Mike Dunlavey 14 PMpSat, 14 Apr 2012 17:10:45 +040010Saturday 2012, 17:10:45
2

Пробел: Используйте специализированные распределители. Таким образом, вы можете записывать точное потребление памяти и события - локально для реализации, которую вы хотите измерить. Например: std::vector<int,t_your_allocator>. Global new /delete (только для тестирования ) и новое размещение - это другие подходы.

Время: Agner - хорошая рекомендация. http://www.agner.org/optimize/ Agner Fog углубляется в затраты и измерения в письменной форме - доступно несколько книг (или руководств). На сайте также размещаются реализации, которые измеряют время выполнения.

ответил justin 14 AMpSat, 14 Apr 2012 11:37:39 +040037Saturday 2012, 11:37:39
1

Я уверен, что у вас должна быть очень хорошая причина для профилирования вашей программы на C ++ с помощью другой программы на C ++. Если вы находитесь в Linux, я предлагаю вам изучить детали файловой системы /proc и файлы, такие как meminfo, которые ОС поддерживает отслеживание использования памяти во время работы.

Если вы настроены исследовать инструменты, которые могут потребовать много усилий для разработки самостоятельно, я предлагаю вам посмотреть в Quantify, VTune, Valgrind и т. д.

ответил Fanatic23 14 PMpSat, 14 Apr 2012 18:58:13 +040058Saturday 2012, 18:58:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132