• Потому что это большая проблема, требующая тщательного решения.
  • А так как есть много людей у ​​которых проблемы с измерением времени улучшить свой код

Позвольте мне показать вам идеальный способ измерения времени в коде C++

Допустим, у меня есть пользовательская функция, которая находит квадратный корень для числа.

И я знаю, что функции floor(sqrt(x)) из библиотеки <cmath> можно использовать!

Но меня очень волнует производительность по времени, и я хочу знать, какая функция выполняется дольше?

Поэтому я много искал и нашел примитивное решение!

который должен вычислить время в каждой функции в ее begin и end и вычислить difference

#include int num = 20221; // measure time for floorSqrt(x) auto begin1 = std::chrono::steady_clock::now(); floorSqrt(num); auto end1 = std::chrono::steady_clock::now(); auto time1 = std::chrono::duration_cast<std::chrono::nanoseconds> (end1 - begin1).count(); // measure time for floor(sqrt(num)) auto begin2 = std::chrono::steady_clock::now(); floor(sqrt(num)); auto end2 = std::chrono::steady_clock::now(); auto time2 = std::chrono::duration_cast<std::chrono::nanoseconds> (end2 - begin2).count(); // print results std::cout << << num << << time1 << std::endl; std::cout << << num << << time2 << std::endl;
floorSqrt (20221) : 130180 floor(sqrt(20221)): 18013

Отлично, теперь я знаю, что floor(sqrt(x)) быстрее на 112167 наносекунд!

Но давайте повторим этот тест 10 раз и посмотрим результат

floorSqrt (20221) : 131491 floor(sqrt(20221)): 130523 floorSqrt (20221) : 1952 floor(sqrt(20221)): 2078 floorSqrt (20221) : 1495 floor(sqrt(20221)): 1825 floorSqrt (20221) : 1460 floor(sqrt(20221)): 1823 floorSqrt (20221) : 1454 floor(sqrt(20221)): 1716 floorSqrt (20221) : 1464 floor(sqrt(20221)): 1720 floorSqrt (20221) : 1498 floor(sqrt(20221)): 1762 floorSqrt (20221) : 1453 floor(sqrt(20221)): 1706 floorSqrt (20221) : 1432 floor(sqrt(20221)): 1730 floorSqrt (20221) : 1461 floor(sqrt(20221)): 1727

Какой правильный тест?!!!

Каков идеальный и точный способ измерения и сравнения времени выполнения?

в этом случае решение очень простое!

  1. зациклить код n раз
  2. сохранить все результаты в массиве
  3. найти срединное число в массиве
  4. сравните средние результаты двух функций

Конечно, это не так просто, нужно учитывать множество деталей!

К счастью, C++ Timeit library был создан для того, чтобы делать эти вещи точно и правильно!

#include std::cout << timeit(1000, floorSqrt, num).nanoseconds() << std::endl;

Не уверены в точности?

Что ж, воспользуемся функцией repeatit, чтобы повторить тест 10 раз и посмотреть результат.

repeatit(10,[]{ std::cout << timeit(1000, floorSqrt, num).nanoseconds() << std::endl; });
5648 5641 5667 5679 5691 5634 5695 5664 5747 5644

Конечно, результаты не будут такими же по другим причинам, но это намного лучше, чем при обычном тесте

[COMPARE IT] first(5827) > second(1770) x3 [COMPARE IT] first(5825) > second(1762) x3 [COMPARE IT] first(5825) > second(1764) x3 [COMPARE IT] first(5832) > second(1765) x3 [COMPARE IT] first(5830) > second(1761) x3 [COMPARE IT] first(5836) > second(1768) x3 [COMPARE IT] first(5824) > second(1767) x3 [COMPARE IT] first(5831) > second(1768) x3 [COMPARE IT] first(5822) > second(1762) x3 [COMPARE IT] first(5828) > second(1765) x3
  • Не запускайте тест в IDE, подобном vscode.
  • Запустите его в терминале, используя что-то вроде valgrind

Таким образом, мы получаем реальную разницу между двумя функциями и точно их сравниваем

Первоначально опубликовано на http://github.com.