我有下面的代码可以正常工作:
auto my_time = std::chrono::system_clock::now();
std::cout << "My Time is " << std::chrono::system_clock::to_time_t(my_time) << std::endl;
但是,如果我用high_resolution_clock替换system_clock,如下所示:
auto my_time = std::chrono::high_resolution_clock::now();
std::cout << "My Time is " << std::chrono::high_resolution_clock::to_time_t(my_time) << std::endl;
我遇到以下错误:
no member named 'to_time_t' in 'std::__1::chrono::steady_clock'
std::cout << "My Time is " << std::chrono::high_resolution_clock::to_time_t(my_time) << std::endl;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
1 error generated.
有什么想法可以使high_resolution_clock在这里起作用吗? (我正在对某些功能进行基准测试,因此想使用high_resolution_clock而不是system_clock)谢谢!
答案 0 :(得分:6)
通常,无法将chrono::high_resolution_clock::time_point
转换为time_t
。这不仅仅是因为它缺少to_time_t
成员函数。这是因为:
时间
time_t
和时间high_resolution_clock::time_point
的测量之间绝对没有关系。
将high_resolution_clock
用作秒表。您可以使用它来衡量某个事件发生所花费的时间。但是您不能用它告诉一天中的时间。
在我的平台上,high_resolution_clock
衡量自系统启动以来nanoseconds
的数量。如果您不知道系统什么时候启动,则无法将high_resolution_clock
转换为一天中的某个时间。
time_t
通常测量的是UTC 1970-01-01 00:00:00以来的时间,因此 与时间有关。< / p>
答案 1 :(得分:3)
在您的系统上,high_resolution_clock
的别名为steady_clock
,这不是标准实现to_time_t
所必需的。两者可能不兼容,例如如果time_t
是距纪元以来的秒数,并且high_resolution_clock::period
小于1秒,那么在不损失精度的情况下,您不能将high_resolution_clock::time_point
表示为time_t
。>
如果将其用于基准测试,则可能完全跳过到time_t
的转换。只需执行以下操作即可:
auto start = std::chrono::high_resolution_clock::now();
my_function();
auto end = std::chrono::high_resolution_clock::now();
std::cout << "my_function took " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << " ms" << std::endl;