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

时间:2012-12-02 04:07:26

标签: c++ stl c++11 chrono

我在C ++ 11中有几个关于新<chrono>标题的问题。使用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";
}

可能的输出

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

2 个答案:

答案 0 :(得分: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_pointtime_t之间的转换。)我想在<chrono>中缺少用于测量CPU时间的时钟是由于时间限制标准委员会以及该功能的使用少于系统的挂钟和实时时钟这一事实。

    如果你想要CPU时间但又想要<chrono>提供的好处,你应该实现一个符合标准中概述的Clock概念的时钟类型,它提供CPU时间,也许可以使用{{1 }}

  2. 的行
    std::clock()

    是导致时间四舍五入到整数秒的原因。您可以选择任何您想要的期间,或者您可以使用浮点表示以允许非整数值:

    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(); 来逃避.count()提供的强类型,直到您绝对必须这样做。

    chrono::duration

答案 1 :(得分:4)

1)我相当确定你可以获得的最高分辨率是使用std::chrono::high_resolution_clock然后不进行任何持续时间的投射:

int elapsed_ticks = (end-start).count();

2)将duration_cast的参数更改为nanoseconds

int elapsed_seconds = std::chrono::duration_cast<std::chrono::nanoseconds>
                             (end-start).count();