Написал свой велосипед для измерения скорости выполнения арифметических операций
https://github.com/DevAlone/CppCodeMeasurer
Время меряю с помощью std::chrono(файл highresolutiontimer.hpp). Тестируемую функцию запускаю так:
template <typename F, typename... Args>
Timer::precision CodeMeasurer::measure(F func, Args... args)
{
// делаем N повторений и записываем результат
for (size_t i = 0; i < NUM_OF_REPETITION; i++) {
t1.reset();
func(args...);
result = t1.elapsed();
results[i] = result;
}
// считаем среднее исключая крайние замеры
result = 0;
for (size_t i = NUM_OF_SKIPPED; i < NUM_OF_REPETITION - NUM_OF_SKIPPED; i++) {
result += results[i];
}
result /= NUM_OF_REPETITION - NUM_OF_SKIPPED * 2;
return result;
}
Передача функции через указатель по идее не должна сказаться на результатах.
Во время первых тестов заметил, что между первым и последующими запусками функции есть разница, вероятно это из-за кеша, поэтому учитываю только результаты "по середине".
Сама тестируемая функция делает операции много раз подряд:
void exec()
{
for (size_t i = 0; i < NUM_OF_REPETITION; i++) {
val1 += val2;
val2 -= val2;
val1 *= val2;
}
}
Компилирую так:
g++ -O0 -o runIt ../main.cpp
Чтобы слишком умный компилятор не вырезал мою функцию своими оптимизациями
Запускаю так:
sudo nice -n -20 ./runIt
Всё ли я учёл для чистоты эксперимента?