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";
}
表現可能な最小期間は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つの積分定数を提供します。num
とden
は、それぞれ分数の分子と分母です。
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
になります。それらのduration
sの1つをNS
に変換すると、Clock
の1クロックティックで何ナノ秒になるかがわかります。そして、その値は、count()
メンバー関数を使用してduration
から抽出できます。
私にとって、このプログラムは次のように出力します。
_1 ns
1000 ns
_
std::ratio
時計のティック周期を秒単位で表すタイプ。名前空間で定義std::chrono
template<intmax_t Num, intmax_t Denom = 1 > class ratio;