问题描述
我在编程方面经验丰富,但对 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