26

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";
}
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これは、コンパイル時の比率を表すテンプレートである特殊化です。これは、2つの積分定数を提供します。numdenは、それぞれ分数の分子と分母です。

于 2011-12-05T13:56:16.733 に答える
25

私はR.MartinhoFernandesの回答に賛成しました。それは、質問に対する最も明確で最も直接的な回答を提供すると信じているからです。ただし、もう少し<chrono>機能を示し、OPの質問のこの部分に対処する小さなコードを追加したいと思いました。

どういうわけか、ダニ間の最小表現可能時間のナノ秒単位のカウントを取得できますか?

そして、これだけの情報をコメントに入れるのは現実的ではありません。しかし、それ以外の点では、この回答はR.MartinhoFernandesの回答に対する支持的なコメントと見なしています。

最初にコード、次に説明:

#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>();
}

最初に、表現としてnanosecondaを使用するを作成しましたdoubleNS)。ナノ秒の端数を表示する必要がある場合に備えて使用doubleしました(例0.5 ns)。

次に、すべてのクロックには、という名前のネストされたタイプがありdurationます。これは、R。Martinho Fernandesの回答で指摘されているものとchrono::duration同じstd::ratioであり、したがって同じです。それらの1つをに変換すると、の1クロックティックで何ナノ秒になるかがわかります。そして、その値は、メンバー関数を使用してから抽出できます。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 に答える