关于C++ 11中<chrono>头的几个问题

new*_*int 10 c++ stl c++11 c++-chrono

<chrono>在C++ 11中有几个关于新标题的问题.使用Windows 7,Visual Studio 2012.

查看示例http://en.cppreference.com/w/cpp/chrono

#include <iostream>
#include <chrono>
#include <ctime>

int fibonacci(int n)
{
    if (n < 3) return 1;
    return fibonacci(n-1) + fibonacci(n-2);
}

int main()
{
    std::chrono::time_point<std::chrono::system_clock> start, end;
    start = std::chrono::system_clock::now();
    int result = fibonacci(42);
    end = std::chrono::system_clock::now();

    int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>
                             (end-start).count();
    std::time_t end_time = std::chrono::system_clock::to_time_t(end);

    std::cout << "finished computation at " << std::ctime(&end_time)
              << "elapsed time: " << elapsed_seconds << "s\n";
}
Run Code Online (Sandbox Code Playgroud)

可能的输出

finished computation at Sat Jun 16 20:42:57 2012
elapsed time: 3s
Run Code Online (Sandbox Code Playgroud)
  1. 我注意到示例用途std::chrono::system_clock::now();是否意味着它可以用于仅测量经过的时间而不是CPU时间??? 如果我想测量CPU时间,我应该使用什么时钟?
  2. 请注意,elapsed time: 3s输出是四舍五入为整数.有没有办法让它更颗粒化?

bam*_*s53 15

  1. 正确

    根据标准:

    system_clock表示来自系统范围实时时钟的[s]挂钟时间.

    <chrono>库不提供测量CPU时间的机制,因此如果您需要,您将不得不<ctime>使用旧库并使用std::clock().

    (如果你的目标是Windows,你将不得不依赖Windows提供的任何特定于平台的API来获取CPU时间,因为正如你所指出的那样,它们std::clock()无法正常工作.)

    system_clock更像是对手而std::time()不是对手std::clock().(例如,注意system_clock提供system_clock::time_points和s 之间的转换time_t.)我认为缺少<chrono>用于测量CPU时间的时钟是由于标准委员会的时间限制以及该功能比系统的挂钟和真实使用更少的事实时钟.

    如果你想要CPU时间但又想要<chrono>提供的好处,你应该实现一个符合标准中概述的Clock概念的时钟类型,它提供CPU时间,也许是内部使用的std::clock().

  2. 这条线说

    int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>
                        (end-start).count();
    
    Run Code Online (Sandbox Code Playgroud)

    是什么导致时间四舍五入到整数秒.您可以选择任何期间,也可以使用浮点表示以允许非整数值:

    std::int64_t elapsed_attoseconds =
        std::chrono::duration_cast<std::chrono::duration<std::int64_t, std::atto>>
            (end-start).count();
    
    double elapsed_seconds =
        std::chrono::duration_cast<std::chrono::duration<double,std::ratio<1>>>
            (end-start).count();
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,在实际代码中,您应该避免使用.count()以逃避提供的强类型,chrono::duration直到您绝对必须.

    auto total_duration = end - start;
    auto seconds = std::chrono::duration_cast<std::chrono::seconds>(total_duration);
    auto milli = std::chrono::duration_cast<std::chrono::milliseconds>(total_duration - seconds);
    
    std::cout << seconds.count() << "s " << milli.count() << "ms\n";
    
    Run Code Online (Sandbox Code Playgroud)

  • 问题是`std :: clock()`测量Windows上的挂起时间和Linux上的CPU时间. (2认同)