C++ 关于<;chrono>;C+中的标题+;11

C++ 关于<;chrono>;C+中的标题+;11,c++,stl,c++11,chrono,C++,Stl,C++11,Chrono,看看这个例子 我注意到示例使用了std::chrono::system_clock::now()这是否意味着它只能用来测量经过的时间而不是CPU时间???如果我想测量CPU时间,我应该使用什么时钟 请注意,经过的时间:3s是四舍五入的整数。有没有办法使它更粒化 1) 我很确定你能得到的最高分辨率是使用std::chrono::high_resolution_clock,然后不进行任何持续时间转换: int elapsed_ticks = (end-start).count(); 2) 将dur

看看这个例子

  • 我注意到示例使用了
    std::chrono::system_clock::now()这是否意味着它只能用来测量经过的时间而不是CPU时间???如果我想测量CPU时间,我应该使用什么时钟
    
  • 请注意,
    经过的时间:3s
    是四舍五入的整数。有没有办法使它更粒化
  • 1) 我很确定你能得到的最高分辨率是使用
    std::chrono::high_resolution_clock
    ,然后不进行任何持续时间转换:

    int elapsed_ticks = (end-start).count();
    
    2) 将duration\u cast的参数更改为类似于
    纳秒的值:

    int elapsed_seconds = std::chrono::duration_cast<std::chrono::nanoseconds>
                                 (end-start).count();
    
    int经过的秒数=std::chrono::duration\u cast
    (结束-开始)。计数();
    
  • 正确的

    根据标准:

    system_clock表示系统范围内实时时钟的墙上时钟时间

    库不提供测量CPU时间的机制,因此,如果您想这样做,您必须使用旧的
    库并使用
    std::clock()

    (如果您的目标是Windows,那么您必须依靠Windows提供的任何特定于平台的API来获得CPU时间,因为正如您所指出的,Windows的
    std::clock()
    无法正常工作。)

    system\u clock
    更像是
    std::time()
    的对应物,而不是
    std::clock()
    。(例如,请注意,
    system\u clock
    提供了
    system\u clock::time\u point
    s和
    time\u t
    之间的转换)我认为,在
    中缺少用于测量CPU时间的时钟是由于标准委员会的时间限制,并且该功能的使用少于系统的挂钟和实时时钟

    如果您既想要CPU时间,又想要
    提供的好处,则应实现符合标准中概述的时钟概念并提供CPU时间的时钟类型,可能在内部使用
    std::clock()
    实现

  • 上面写着


  • 2.嗯,是的,你用了
    。使用
    毫秒
    和瞧,更粒化!见鬼,如果你想的话,用
    纳秒
    。@chris Hm…很好的建议。双已用秒=(std::chrono::duration_cast(end-start).count())/1000;旁白:请注意,我遇到了一个编译器,它将
    end
    理解为
    std::end
    。它可能是GCC4.7.1,但我可能错了。我知道最新版本的GCC不再这样做,但如果您有其他编译器将使用它,则需要注意。
    是一个头(和名称空间),而不是一个类。我帮你们纠正了。问题是
    std::clock()
    在Windows上测量墙时间,在Linux上测量CPU时间。@newprint是的,这很不幸。微软应该修复它们的实现以符合标准规范。作为一个(重要的)注意事项,VS2012中当前的
    std::chrono::high_resolution_clock
    中存在一个“缺陷”,即使用
    QueryPerformanceCounter
    并进行一些计算的分辨率要低得多。请参阅:此错误仍然存在于VS2013预览中。
    int elapsed_ticks = (end-start).count();
    
    int elapsed_seconds = std::chrono::duration_cast<std::chrono::nanoseconds>
                                 (end-start).count();
    
    int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>
                        (end-start).count();
    
    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();
    
    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";