devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻

Как правильно измерять код?

Написал свой велосипед для измерения скорости выполнения арифметических операций 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
Всё ли я учёл для чистоты эксперимента?
  • Вопрос задан
  • 262 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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