chrono 在 C++ 中可以测量的最大时间间隔是多少?

问题描述

我在编程方面经验丰富,但对 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();

解决方法

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 进行挂钟时间。>

,

这是一个内容丰富的小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";
}

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

对我来说这只是输出:

292.256 years until overflow