2017-03-05 6 views
5

私は、レイテンシ要件が低いプログラムの一部のタイミングコードを書いています。C++を使用して移植可能なタイミングコードの正しい方法11

std :: chronoライブラリで利用できるものを見ると、移植性のあるタイミングコードを書くのは少し難しいと思っています。

  1. のstd ::クロノ:: high_resolution_clock
  2. のstd ::クロノ:: steady_clock
  3. のstd ::クロノ:: SYSTEM_CLOCK

SYSTEM_CLOCKは、それが安定しないと、役に立たない残り2つのクロックに問題があります。

high_resolution_clockは必ずしもすべてのプラットフォームで安定しているとは限りません。

steady_clockは必ずしも微粒子解像度の期間(例:ナノ秒)をサポートしていません、私の目的は、安定したクロックを持つために

は、最も重要な要件であると私は一種のマイクロ秒の粒度とによって得ることができます。

私の質問は、異なるh/wアーキテクチャーやOSで動作するタイムコードが必要な場合です。何が最善の選択肢ですか?

+4

あなたが絶対に後退できない場合は、安定している必要があります。まれな偽の後方プロファイリング値は...それは誰かを殺すだろうか? – Yakk

+0

@ Yakkはまた、NTPなどによる時間の変更など、ジャンプ先にも使用できますか? –

+2

しかし、あなたはプロファイリングしています。いくつかのノイズは、コンテクストスイッチなどから予期されることがある。それが不安定であるという点は、しばしば安定した保証が*高価であるということです。保証を必要としない限り、その保証は価値がありません。 – Yakk

答えて

3

steady_clockを使用してください。すべての実装で、その精度はナノ秒です。 steady_clock::period::numsteady_clock::period::denを印刷することで、自分のプラットフォームでこれを確認できます。

ここで実際にナノ秒の精度を測定するわけではありません。しかし、プラットフォームは最善を尽くします。私にとっては、steady_clockへの2回の連続呼び出し(最適化を有効にして)は、100nsの間隔で時間を報告します。

#include "chrono_io.h" 
#include <chrono> 
#include <iostream> 

int 
main() 
{ 
    using namespace std::chrono; 
    using namespace date; 
    auto t0 = steady_clock::now(); 
    auto t1 = steady_clock::now(); 
    auto t2 = steady_clock::now(); 
    auto t3 = steady_clock::now(); 
    std::cout << t1-t0 << '\n'; 
    std::cout << t2-t1 << '\n'; 
    std::cout << t3-t2 << '\n'; 
} 

上記の例では、このフォーマットは便宜上、free, open-source, header-only libraryを使用しています。あなたは自分自身をフォーマットすることができます(私は怠惰です)。私にとってこれはちょうど出力されます:

287ns 
116ns 
75ns 

YMMV。

+1

優れた回答!ありがとうございました。しかし、stable_clockを使った場合、high_resolution_clockの目的は何ですか?また、steady_clockよりもhigh_resolution_clockのユースケース(または持っているもの)はどれですか? –

+0

@SariT .:参照してください:http://stackoverflow.com/a/37440647/576911 –

+0

Windowsの場合、steady_clockは高性能カウンタです。 Windows XPの場合、これは通常3.5 GHzなどのCPUクロックレートで実行されます。 Windows 7以降では、これは通常、CPUクロックレートの1/1000、たとえば3.5 mhzで実行されます。私はWindows Vistaについて知らない。 – rcgldr

関連する問題