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

What is the maximum time interval chrono can measure in C++?

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

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

我使用了下面的代码,请告诉我是否可以改进:

#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 指出的,您可能会遇到一些问题 if/when 时钟溢出(但我在 cppreference 上没有看到任何提及)。

此外,

The high_resolution_clock is not implemented consistently across different standard library implementations, and its use should be avoided.

[...]

Generally one should just use std::chrono::steady_clock or std::chrono::system_clock directly instead of std::chrono::high_resolution_clock: use steady_clock for duration measurements, and system_clock for wall-clock time.

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