如何获得高分辨率时钟的精度



C++11定义了high_resolution_clock,它具有成员类型periodrep。但我不知道如何才能得到那个时钟的精度

或者,如果我可能无法达到精度,我是否可以至少以纳秒为单位计算出两个刻度之间的最小可表示持续时间?可能使用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? */
              << " nanosn";
}

可表示的最小持续时间为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的专门化,CCD_7是表示编译时比率的模板。它提供了两个积分常数:numden,分别是分数的分子和分母。

我支持R.Martinho Fernandes的答案,因为我相信它为这个问题提供了最清晰、最直接的答案。然而,我想添加一个小代码,它显示了更多的<chrono>功能,并解决了OP问题的这一部分:

我能以某种方式至少得到一个以纳秒为单位的最小计数吗刻度之间可表示的持续时间?

把这么多信息放到评论中是不切实际的。但除此之外,我认为这个答案是对R·马丁尼奥·费尔南德斯答案的支持。

首先是代码,然后是解释:

#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() << " nsn";
}
int main()
{
    display_precision<std::chrono::high_resolution_clock>();
    display_precision<std::chrono::system_clock>();
}

首先,我创建了一个使用double作为表示的nanosecond(NS(。我使用double只是为了防止我需要显示纳秒的分数(例如0.5 ns(。

接下来,每个时钟都有一个名为duration的嵌套类型。这是一个chrono::duration,它将具有相同的std::ratio,因此具有与R.Martinho Fernandes的回答中指出的相同的CCD19和den。这些duration中的一个,转换为NS,将给出Clock的一个时钟周期中有多少纳秒。并且该值可以通过count()成员函数从duration中提取。

对我来说,这个程序打印出来:

1 ns
1000 ns

std::ratio类型,表示时钟的刻度周期,单位为秒。在命名空间std::chrono 中定义

template<intmax_t Num, intmax_t Denom = 1 > class ratio;

最新更新