Как я могу считать операции в C ++? - PullRequest
5 голосов
/ 01 ноября 2008

Как я могу считать операции в C ++? Я хотел бы проанализировать код лучше, чем просто синхронизировать его, поскольку время часто округляется до 0 миллисекунд.

Ответы [ 11 ]

7 голосов
/ 01 ноября 2008

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

5 голосов
/ 01 ноября 2008

Использование «количества операций» является плохой идеей, если думать о производительности. При этом не учитываются различия между количеством циклов в лучшем и худшем случаях для каждой операции, затратами на кеширование, пропуски конвейера, потенциальное (автоматическое) распараллеливание и т. Д.

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

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

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * 10 * * * * * * * * * * * * '*' '' '' '' '*' '' '' '' '' '' '' '' '' '' '(' '' '' '' n) и т. д. Обычно это не подразумевает знания деталей того, что делают отдельные инструкции в C ++, хотя вам do необходимо знать всю сложность всего, что вы вызываете. (История Джоэля о том, что Художник Шлемиэль и являются наиболее очевидным примером.)

4 голосов
/ 01 ноября 2008

Образец профилировщика - хороший выбор здесь. В Windows можно использовать профилировщик , встроенный в Visual Studio , или xperf tools из организации Windows. Инструменты xperf бесплатны. Вот серия сообщений по инструментам xperf от меня. Это профилирование .

3 голосов
/ 01 ноября 2008

Вы можете выполнять точные измерения, считывая счетчик меток времени ( tsc ) ЦП, который увеличивается на единицу на каждый процессор.

К сожалению, чтение выполняется с помощью инструкций ассемблера в коде. В зависимости от базовой архитектуры стоимость чтения варьируется от ~ 11 (AMD) до ~ 33 (Intel) tsc . С 1 ГГц процессором вы можете практически с точностью до наносекунды.

Чтобы выполнить надежную и неинвазивную меру части кода, вы можете:

  • предотвратить частоту масштабирования процессора, отключив такие функции процессора, как AMD круто и совсем или Intel SpeedStep .
  • повторить тест несколько раз, собрав меры в массив, а затем сохранив данные в файл для автономного анализа.
  • выберите политику планирования в реальном времени для тестируемого процесса, например SHED_RR или SHED_FIFO . Политики реального времени уменьшают количество переключений контекста между тестируемым процессом и другими обычными процессами / потоками ядра, которые заблокированы.
  • заблокировать все виртуальное адресное пространство процесса в оперативной памяти с помощью системного вызова mlockall ().

Здесь вы можете найти квазипортативный класс C ++, который я написал для Linux, производный от ядра Linux и разработанный для чтения tsc для архитектур i386, x86_64 и ia64.

3 голосов
/ 01 ноября 2008

Используйте valgrind в Linux. Он имеет временную шкалу команд, включая анализ кэша.

3 голосов
/ 01 ноября 2008

Создание операций сборки и подсчета. Затем просмотрите циклы / операции, которые использует ваш процессор. Тогда помните, что вы работаете в упреждающей ОС, и все это недействительно.

А если серьезно, поднимите n и масштабируйте свою программу до неприличных размеров. Это даст вам представление о скорости вашей программы.

2 голосов
/ 01 ноября 2008

Если вы хотите, чтобы фактическое количество операций приходилось на ваше оборудование, тогда вы можете рассмотреть возможность установки пакета, подобного PAPI - Performance API - который работает во многих различных комбинациях ОС и процессоров. Он использует фактические аппаратные счетчики и сообщает либо прямые, либо производные значения для множества различных метрик производительности, таких как Total Ops, FLOPS, попадания / отсутствия кэша и т. Д. Он также может предоставлять доступ к таймерам с более высоким разрешением.

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

0 голосов
/ 05 ноября 2008

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

0 голосов
/ 02 ноября 2008

Если вам нужна точная синхронизация (в Windows) без использования профилировщика, вы можете взглянуть на этот поток , который представляет различные способы профилирования кода C ++.

0 голосов
/ 02 ноября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...