web-dev-qa-db-ja.com

high_resolution_clockの精度を取得するにはどうすればよいですか?

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

表現可能な最小期間は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は、それぞれ分数の分子と分母です。

28

R. Martinho Fernandesの回答は、質問に対する最も明確で最も直接的な回答を提供すると信じているため、賛成しました。ただし、もう少し_<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>();
}
_

最初に、表現としてnanosecondを使用するdoubleを作成しました(NS)。ナノ秒の端数を表示する必要がある場合に備えて、doubleを使用しました(例:_0.5 ns_)。

次に、すべての時計にはdurationという名前のネストされた型があります。これは_chrono::duration_であり、同じ_std::ratio_を持つため、R。MartinhoFernandesの回答で指摘されているのと同じnumおよびdenになります。それらのdurationsの1つをNSに変換すると、Clockの1クロックティックで何ナノ秒になるかがわかります。そして、その値は、count()メンバー関数を使用してdurationから抽出できます。

私にとって、このプログラムは次のように出力します。

_1 ns
1000 ns
_
21
Howard Hinnant

std::ratio時計のティック周期を秒単位で表すタイプ。名前空間で定義std::chrono

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