2016-12-23 8 views
-4

Что такое рекомендуемая методология/библиотека для точного бенчмаркинга кода C/C++? Что-то, что позволит преодолеть неточности простого измерения времени выполнения, то есть частота процессора и загрузка системы могут измениться во время выполнения. Не уверен, что подсчет выполненных инструкций является правильным подходом, потому что узкое место в моем коде (вероятно) будет доступ к памяти.Простой, но точный бенчмаркинг кода C/C++

+0

Что такое код C/C++? –

+0

@LightnessRacesinOrbit google it – fhucho

+0

Хорошо, теперь я знаю спасибо –

ответ

3

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

+0

gprof не может быть использован, если у вас есть библиотеки, которые не компилируются с -p (gprof enable), поэтому функции библиотеки могут неточно подсчитываться в тестах –

+0

@ e.jahandar Да, только функция верхнего уровня вызывает библиотека будет ориентирована. Но если у вас нет исходного кода lib, вам, как правило, не заботятся и о функциях нижнего уровня. На самом деле системные вызовы и многопоточность дают больше проблем. –

0

То, о чем вы просите, почти невозможно.

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

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

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

Фактически, «время работы больше не существует.

+0

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

+0

Проблема с простым бенчмаркингом заключается в том, что мы не знаем, улучшается ли измеренное время выполнения в результате изменения среды или модифицированной программы. Усреднение помогает, но только в некоторой степени. То, что я искал, сводило к минимуму влияние случайного окружения (например, частоты процессора). – fhucho

+0

Частота процессора - это единственный параметр, который совершенно неслучайный! –

-1

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

3

Если вы на X86, вы можете попробовать Intel V-Tune Amplifier, он дал вам глубокий анализ микро архитектуры приложений C или C++. Он использует встроенные счетчики производительности процессора для измерения времени выполнения, а также пропусков в кеш-памяти и много информации об уровне микроархитектуры.

+0

Другие программы могут использовать те же аппаратные счетчики производительности. например на Linux 'perf stat./myprogram' будет измерять набор счетчиков по умолчанию по всей программе. –