【问题标题】:What is the maximum time interval chrono can measure in C++?chrono 在 C++ 中可以测量的最大时间间隔是多少?
【发布时间】:2021-03-14 10:03:48
【问题描述】:

我在编程方面经验丰富,但对 C++ 很陌生。我正在尝试测量运行代码所需的时间。将来我可能会编写可能需要数小时/数天才能完成的代码。因此,了解计时时间测量的限制对我来说很重要。以毫秒为单位的精度应该足够了。

我可以测量的最长时间是多少?

我使用了以下代码,如果可以改进,请告诉我:

#include <chrono> 
using namespace std::chrono;

auto start = high_resolution_clock::now();

// calculations here

auto finish = high_resolution_clock::now();

duration<double> elapsed = finish - start; // elapsed time in seconds
cout << elapsed.count();

【问题讨论】:

    标签: c++ time chrono measurement


    【解决方案1】:

    这是一个内容丰富的小 HelloWorld:

    #include <chrono>
    #include <iostream>
    
    int
    main()
    {
        using namespace std::chrono;
        using namespace std;
    
        using years = duration<double, ratio_multiply<ratio<86'400>, ratio<146'097, 400>>>;
        cout << years{high_resolution_clock::time_point::max() - 
                      high_resolution_clock::now()}.count()
             << " years until overflow\n";
    }
    

    我首先创建了一个基于双年的持续时间,以便输出易于阅读。然后我从time_pointmax() 中减去now(),将其转换为年份并打印出来。

    对我来说这只是输出:

    292.256 years until overflow
    

    【讨论】:

      【解决方案2】:

      std::chrono::milliseconds 保证存储在至少 45 位的底层有符号整数上,这意味着如果您经过的持续时间少于 544 年,您应该没问题。

      来源:https://en.cppreference.com/w/cpp/chrono/duration

      编辑:正如orlp 指出的那样,如果/当时钟溢出时,您可能会遇到一些问题(但我在 cppreference 上没有看到任何提及)。

      还有,

      high_resolution_clock 在不同标准库实现中的实现不一致,应避免使用它。

      [...]

      通常应该直接使用 std::chrono::steady_clock 或 std::chrono::system_clock 而不是 std::chrono::high_resolution_clock:使用 stable_clock 进行持续时间测量,使用 system_clock 进行挂钟时间。

      【讨论】:

      • 还没有。您还需要显示high_resolution_clock 有足够的位。垃圾进,垃圾出。
      • @orlp 我回答了,但我完全不确定自己......在采取差异之前,high_resolution_clocktime_points 的分辨率至少低于毫秒,不是吗?所以更多的是在那之后的持续时间范围,不是吗?
      • 你必须考虑时钟本身溢出的场景。
      • 感谢您的回答!我在这里找到了有关溢出的信息:stackoverflow.com/questions/48703424/… 我们可以安全地假设 stable_clock::now() 在几天内不会溢出吗?
      猜你喜欢
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 2017-08-31
      • 2016-07-30
      • 2023-04-10
      • 2011-06-10
      相关资源
      最近更新 更多