Как использовать хроно для расчета времени алгоритма с таймером-аккумулятором?

Мой код выглядит примерно так:

std::chrono::milliseconds total;
for (int i=0; i<max; i++) {
    auto start = std::chrono::high_resolution_clock::now();
    // some code I want to benchmark
    total += std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start);
    // some code I don't want to account for in my benchmark
}
std::cout << total.count() << std::endl;

Когда я запускаю этот код, я иногда получаю в результате 2, 3 и даже 4. Однако в других случаях я получаю случайный результат, например 139984111729355 или -4800608627507701400.

Почему это?


person user1546022    schedule 04.08.2017    source источник
comment
Попробуйте инициализировать вашу переменную total   -  person Tristan Brindle    schedule 04.08.2017
comment
Этот вид бенчмаркинга немного «грубый и готовый». Если вам нужно что-то более точное, Google выпустила потрясающую библиотеку тестов, очень простую в использовании. Чендлер Каррут отлично рассказал об этом на YouTube.   -  person Treebeard    schedule 04.08.2017


Ответы (1)


std::chrono::milliseconds total; // (1)
for (int i=0; i<max; i++) {
    auto start = std::chrono::high_resolution_clock::now();
    // some code I want to benchmark
    total += std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start);
    // some code I don't want to account for in my benchmark
}
std::cout << total.count() << std::endl;

Это вполне допустимый шаблон, но проблема в том, что ваша переменная total в (1) не инициализирована. Если вы замените его на

std::chrono::milliseconds total{};

тогда он должен работать как задумано.

person Tristan Brindle    schedule 04.08.2017