【问题标题】:How to get the precision of high_resolution_clock?如何获得 high_resolution_clock 的精度?
【发布时间】:2012-01-13 05:47:41
【问题描述】:

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";
}

【问题讨论】:

  • 您在寻找std::ratio 吗?
  • @Yappie:部分,但如何从那里开始?
  • std::ratio 基本上是用于编译时间算术的编译时间值。它没有实例成员,只有静态 constexpr 成员,因此“初始化”比率没有任何意义。如果时钟周期小于或等于一毫秒,您可以执行 std::ratio_less_equal&lt;std::milli,std::high_resolution_clock::period&gt;::value 之类的操作,这将是 true
  • 只是想说明@bames53 已交换操作数。以防万一有人不熟悉 std::ratio_less_equal 并对语义感到疑惑(比如我)。

标签: c++ c++11 clock duration chrono


【解决方案1】:

可表示的最短持续时间为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,分别是分数的分子和分母。

【讨论】:

  • 知道了!总有一天,我会学习如何查看所有ratios 的隐藏位置。
【解决方案2】:

我赞成 R. Martinho Fernandes 的回答,因为我相信它为这个问题提供了最清晰、最直接的答案。但是,我想添加一些代码,显示更多 &lt;chrono&gt; 功能并解决 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,因此具有相同的numden,正如R. Martinho Fernandes 的回答中所指出的那样。其中一个durations 转换为NS 将告诉我们Clock 的一个时钟滴答中有多少纳秒。并且可以使用count() 成员函数从duration 中提取该值。

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

1 ns
1000 ns

【讨论】:

  • 是的,你成功地提高了我对chrono的理解。 chrono::nanoseconds 不适合NS?等等……我试试看。
  • 好吧,实际上我第一次几乎就拥有了它:typename Clock::duration x{1}; cout &lt;&lt; duration_cast&lt;nanoseconds&gt;(x).count() &lt;&lt; " ns\n"; 我没有成功,因为我之前尝试过x = 1 而不是x{1}。这是一个explicit 构造函数。
  • @towi:在显式构造函数上更正。这样就不会意外地将标量传递给具有持续时间的函数,并且该调用的持续时间单位不是明确的。
  • @towi: chrono::nanoseconds 将适用于NS,如果这是Clock::durationchrono::nanoseconds 之间的精确 转换。对于我所知道的所有平台,这都是真的。但是,Clock::duration 可能是皮秒。在这种情况下,尝试将皮秒转换为基于整数的chrono::nanoseconds 时会出现编译时失败。但是使用双基纳秒会导致 0.001 存储在 ns 中。
【解决方案3】:

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

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

【讨论】:

  • 我必须承认我没有看到这个比率究竟隐藏在哪里,以及如何使用它。现在明白了。
猜你喜欢
  • 2015-02-12
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
相关资源
最近更新 更多