Вы можете использовать лямбда с auto
параметров в C++ 14, чтобы время ваши другие функции. Вы можете передать параметры временной функции на ваш лямбда. Я хотел бы сделать это следующим образом:
// Timing in C++14 with auto lambda parameters
#include <iostream>
#include <chrono>
// need C++14 for auto lambda parameters
auto timing = [](auto && F, auto && ... params)
{
auto start = std::chrono::steady_clock::now();
std::forward<decltype(F)>(F)
(std::forward<decltype(params)>(params)...); // execute the function
return std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - start).count();
};
void f(std::size_t numsteps) // we'll measure how long this function runs
{
// need volatile, otherwise the compiler optimizes the loop
for (volatile std::size_t i = 0; i < numsteps; ++i);
}
int main()
{
auto taken = timing(f, 500'000'000); // measure the time taken to run f()
std::cout << "Took " << taken << " milliseconds" << std::endl;
taken = timing(f, 100'000'000); // measure again
std::cout << "Took " << taken << " milliseconds" << std::endl;
}
Преимущество заключается в том, что вы можете передать любой вызываемый объект в timing
лямбда. Если вы не можете использовать параметры лямбда C++ 14 auto
, тогда вам нужно написать шаблонный функтор, чтобы «имитировать» лямбда.
Но если вы хотите сохранить его простым, вы можете просто сделать:
auto start = std::chrono::steady_clock::now();
your_function_call_here();
auto end = std::chrono::steady_clock::now();
auto taken = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
std::cout << taken << " milliseconds";
Если вы знаете, что вы не собираетесь изменять системное время во время бега, вы можете использовать вместо std::chrono::high_resolution_clock
, который может быть более точным. std::chrono::steady_clock
, однако, не чувствителен к изменениям системного времени во время прогона.
читать на 'станд: : chrono', но следите за сроками gotchas в разных операционных системах. Например, Windows любит давать время с шагом 15,625 мс. – user4581301