26

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? */
              << " nanos\n";
}
4

3 回答 3

31

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

于 2011-12-05T13:56:16.733 回答
25

我赞成 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使用 adouble作为表示 ( NS) 的 a。我使用double以防万一我需要显示几分之一纳秒(例如0.5 ns)。

接下来,每个时钟都有一个名为 的嵌套类型duration。正如 R. Martinho Fernandes 的回答中所指出的那样,这是一个chrono::duration具有相同的std::ratio,因此是相同的。其中一个s,转换为将给我们在一个时钟滴答中多少纳秒。并且可以从with成员函数中提取该值。numdendurationNSClockdurationcount()

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

1 ns
1000 ns
于 2011-12-05T14:50:58.433 回答
2

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

template<intmax_t Num, intmax_t Denom = 1 > class ratio;
于 2011-12-05T13:43:27.590 回答