Как правильно сделать бенчмаркинг для кода C / C ++? - PullRequest
0 голосов
/ 29 апреля 2020

Я спрашиваю относительно ответов на этот вопрос . В своем ответе я сначала получил время до и после циклов и распечатал их разницу, но как обновление для ответа @cigien s, кажется, что я провел неточные тесты, не прогревая код.

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

1 Ответ

2 голосов
/ 30 апреля 2020

Чтобы дать вам пример разминки, я недавно протестировал некоторые вызовы ядра nvidia cuda:

Скорость выполнения, кажется, со временем увеличивается, вероятно, по нескольким причинам, таким как тот факт, что частота графического процессора переменная (для экономии энергии и перезарядки).

Иногда более медленный вызов оказывает еще большее влияние на следующий вызов, поэтому тест может вводить в заблуждение.

Если вам нужно чувствовать себя в безопасности в отношении этих точек Я советую вам:

  • зарезервировать всю динамическую c память (подобно векторам) сначала
  • сделать для l oop, чтобы выполнить ту же работу несколько раз перед измерение
  • это подразумевает инициализацию входных данных (особенно случайных) только один раз перед l oop и их копирование каждый раз внутри l oop, чтобы гарантировать, что вы выполняете ту же работу
  • если вы имеете дело со сложными объектами с кешем, я советую вам упаковать их в структуру и создать массив этой структуры (с той же техникой построения или клонирования), чтобы Убедитесь, что та же самая работа выполняется с теми же начальными данными в l oop
  • , вы можете избежать выполнения for l oop и копирования данных, если вы чередуете два вызова очень часто и предполагаете, что влияние различия в поведении будут взаимно компенсировать друг друга, например, при моделировании непрерывных данных, таких как позиции

относительно инструментов измерения, я всегда сталкивался с проблемами с high_resolution_clock на разных машинах, такими как непоследовательность продолжительность. Напротив, windows QueryPerformanceCounter очень хорош.

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ

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

...