我需要计算我的功能所用的时间。现在我正在使用std :: clock,根据我的理解,这是测量CPU时间,这可能与实时不同。
std::clock_t start;
double duration;
start = std::clock();
someFunctionToMeasure();
duration = (std::clock() - start) / (double)CLOCKS_PER_SEC;
所以有两件事我想知道
std :: clock是如何工作的?它只是在计算功能时测量CPU吗?
有没有更好的方法来衡量计算我的功能所用的时间?
答案 0 :(得分:3)
只想使用现代方法来使用<chrono>
和来自C ++ 17的方便std::invoke
计时任何可调用对象。适用于成员,lambdas或自由职能,或任何其他可赎回。
// Just for convenience
using Seconds = std::chrono::duration<double>;
// Measure how much time the given function takes to execute using chrono
// Pass the function name, then all relevant arguments, including the object as the first if it's a member function
template<typename Function, typename... Args>
Seconds measure(Function&& toTime, Args&&... a)
{
auto start{std::chrono::steady_clock::now()}; // Start timer
std::invoke(std::forward<Function>(toTime), std::forward<Args>(a)...); // Forward and call
auto stop{std::chrono::steady_clock::now()}; // Stop timer
return (stop - start);
}
这将返回函数执行的时间。如果您还需要返回值,则可以使用std::pair
生成Seconds
,并且返回值,因为std::invoke
将正确返回可调用返回的内容。
然后你可以像这样使用它:
auto t1 = measure(normalFunction);
auto t2 = measure(&X::memberFunction, obj, 4);
auto t3 = measure(lambda, 2, 3);
分别在自由函数,成员函数和lambda上。
答案 1 :(得分:2)
使用value
,您需要的代码如下所示:
<chrono>
如果您需要多次此片段,并且start / end是您调用using clock = std::chrono::system_clock;
using ms = std::chrono::milliseconds;
const auto before = clock::now();
someFunctionToMeasure();
const auto duration = std::chrono::duration_cast<ms>(clock::now() - before);
std::cout << "It took " << duration.count()/1000.0 << "ms" << std::endl;
的作用域的近似入口和出口点,将它包装到一个实用程序类中可能是有意义的,该实用程序类使两次调用构造函数和析构函数中的someFunctionToMeasure()
。
答案 2 :(得分:1)