C ++ 11定义high_resolution_clock
,它有成员类型period
和rep
。但我无法弄清楚如何获得该时钟的精度。
或者,如果我可能无法达到精确度,我能以某种方式至少得到一个在纳秒之间的最小可表示持续时间的计数吗?可能使用period
?
#include <iostream>
#include <chrono>
void printPrec() {
std::chrono::high_resolution_clock::rep x = 1;
// this is not the correct way to initialize 'period':
//high_resolution_clock::period y = 1;
std::cout << "The smallest period is "
<< /* what to do with 'x' or 'y' here? */
<< " nanos\n";
}
答案 0 :(得分:25)
最小可表示的持续时间为high_resolution_clock::period::num / high_resolution_clock::period::den
秒。你可以像这样打印:
std::cout << (double) std::chrono::high_resolution_clock::period::num
/ std::chrono::high_resolution_clock::period::den;
这是为什么?时钟的::period
成员被定义为“以秒为单位的时钟的滴答周期”。它是std::ratio
的一个特化,它是一个表示编译时比率的模板。它提供了两个积分常数:num
和den
,分别是分数的分子和分母。
答案 1 :(得分:20)
我赞成R. Martinho Fernandes的答案,因为我相信它提供了最清晰,最直接的答案。但是,我想添加一些显示更多<chrono>
功能的代码,并解决了OP问题的这一部分:
我能以某种方式至少得到最小纳秒的计数 刻度之间的可表示的持续时间?
将这么多信息写入评论是不切实际的。但我认为这个答案是对R. Martinho Fernandes的回答的支持性评论。
首先是代码,然后是解释:
#include <iostream>
#include <chrono>
template <class Clock>
void
display_precision()
{
typedef std::chrono::duration<double, std::nano> NS;
NS ns = typename Clock::duration(1);
std::cout << ns.count() << " ns\n";
}
int main()
{
display_precision<std::chrono::high_resolution_clock>();
display_precision<std::chrono::system_clock>();
}
首先,我创建了nanosecond
,使用double
作为表示(NS
)。我使用double
以防万一我需要显示几分之一纳秒(例如0.5 ns
)。
接下来,每个时钟都有一个名为duration
的嵌套类型。这是一个chrono::duration
,它具有相同的std::ratio
,因此与R. Martinho Fernandes的答案中指出的num
和den
相同。其中一个转换为duration
的{{1}}将在NS
的一个时钟周期中给出一个纳秒。并且可以使用Clock
成员函数从duration
中提取该值。
对我来说,这个节目打印出来:
count()
答案 2 :(得分:2)
表示时钟节拍周期的std::ratio
类型,以秒为单位。在命名空间std::chrono
中定义
template<intmax_t Num, intmax_t Denom = 1 > class ratio;