如何获得high_resolution_clock的精度?

tow*_*owi 24 c++ duration clock c++11 c++-chrono

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";
}
Run Code Online (Sandbox Code Playgroud)

R. *_*des 27

最小可表示的持续时间是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;
Run Code Online (Sandbox Code Playgroud)

为什么是这样?时钟的::period成员定义为"以秒为单位的时钟的滴答周期".它的特殊化std::ratio是在编译时表示比率的模板.它提供了两个积分常数:numden分数的分子和分母.


How*_*ant 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>();
}
Run Code Online (Sandbox Code Playgroud)

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

接下来,每个时钟都有一个名为的嵌套类型duration.这是一个与R. Martinho Fernandes的答案chrono::duration相同的std::ratio,因此也是如此.其中一个转换为将在一个时钟周期内给出多少纳秒.并且可以使用成员函数从该值中提取该值.numdendurationNSClockdurationcount()

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

1 ns
1000 ns
Run Code Online (Sandbox Code Playgroud)

  • @towi:如果这是`Clock::duration` 和`chrono::nanoseconds` 之间的*精确* 转换,`chrono::nanoseconds` 将适用于`NS`。对于我所知道的所有平台,这都是正确的。然而,`Clock::duration` 可能是皮秒。在这种情况下,在尝试将皮秒转换为基于积分的 `chrono::nanoseconds` 时,您会遇到编译时失败。但是使用基于双精度的纳秒会导致 0.001 存储在 `ns` 中。 (2认同)