计算C ++中经过的时间

时间:2018-06-16 20:48:19

标签: c++ clock

我需要计算我的功能所用的时间。现在我正在使用std :: clock,根据我的理解,这是测量CPU时间,这可能与实时不同。

std::clock_t start;
double duration;

start = std::clock();

someFunctionToMeasure();

duration = (std::clock() - start) / (double)CLOCKS_PER_SEC;

所以有两件事我想知道

  1. std :: clock是如何工作的?它只是在计算功能时测量CPU吗?

  2. 有没有更好的方法来衡量计算我的功能所用的时间?

3 个答案:

答案 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)

来源: http://en.cppreference.com/w/cpp/chrono/c/clock

  1. 时钟仅跟踪时钟正在执行的process上已经过去的时间。因此,您的示例代码将跟踪您的函数执行所需的CPU时间。这与跟踪实时情况明显不同,因为您的函数运行的进程可能是preempted和cpu当你的函数等待完成时,可以执行其他代码一段时间。

  2. 要回答您的第二个问题,可能有助于澄清“更好”的含义。听起来你想跟踪你的函数执行的时间,从我的理解,这段代码完成了这项任务。如果您想实时跟踪时间量,其他答案会举例说明。