- Потому что это большая проблема, требующая тщательного решения.
- А так как есть много людей у которых проблемы с измерением времени улучшить свой код
Позвольте мне показать вам идеальный способ измерения времени в коде 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
Какой правильный тест?!!!
Каков идеальный и точный способ измерения и сравнения времени выполнения?
в этом случае решение очень простое!
- зациклить код
n
раз - сохранить все результаты в массиве
- найти срединное число в массиве
- сравните средние результаты двух функций
Конечно, это не так просто, нужно учитывать множество деталей!
К счастью, 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.