私は正確なタイミングが重要で、C++ 11で指定された3種類のクロック、すなわちsystem_clock
,steady_clock
、およびhigh_resolution_clock
を調べていました。 私の最初の懸念は、さまざまなタイプのクロックに対するコールオーバーヘッドに違いがあるかどうかをテストし、各タイプのクロックの解像度をチェックすることでした。私はG ++ 4.7.2でコンパイルさC++ 11クロック:g ++ steady_clock :: is_steady == false?
$ g++-4.7 -std=c++11 -Dhrc chrono.cpp -o hrc_chrono
chrono.cpp:15:2: warning: #warning "High resolution clock" [-Wcpp]
$ g++-4.7 -std=c++11 -Dsys chrono.cpp -o sys_chrono
chrono.cpp:15:2: warning: #warning "System clock" [-Wcpp]
$ g++-4.7 -std=c++11 -Dsc chrono.cpp -o sc_chrono
chrono.cpp:15:2: warning: #warning "Steady clock" [-Wcpp]
Iでそれをコンパイルし、
- SUSE Linuxでは、カーネルv3.1.10でそれを実行した
#include <chrono> #include <cstdio> using namespace std; using namespace std::chrono; int main(int argc, char **argv) { size_t N = 1e6; if(2 == argc) { sscanf(argv[1], "%zu", &N); } #if defined(hrc) typedef high_resolution_clock clock; #warning "High resolution clock" #elif defined(sc) typedef steady_clock clock; #warning "Steady clock" #elif defined(sys) typedef system_clock clock; #warning "System clock" #endif const double resolution = double(clock::period::num)/double(clock::period::den); printf("clock::period: %lf us.\n", resolution*1e6); printf("clock::is_steady: %s\n", clock::is_steady ? "yes" : "no"); printf("Calling clock::now() %zu times...\n", N); // first, warm up for(size_t i=0; i<100; ++i) { time_point<clock> t = clock::now(); } // loop N times time_point<clock> start = clock::now(); for(size_t i=0; i<N; ++i) { time_point<clock> t = clock::now(); } time_point<clock> end = clock::now(); // display duration duration<double> time_span = duration_cast<duration<double>>(end-start); const double sec = time_span.count(); const double ns_it = sec*1e9/N; printf("That took %lf seconds. That's %lf ns/iteration.\n", sec, ns_it); return 0; }
: は、ここに私のサンプルプログラムです、CPU i7
- Angstrom Linux組み込みシステム、カーネルv3.1.10、MCU Tegra 2(ARM Cortex A9)。
最初の驚くべきことは、3種類のクロックが明らかに同義語であることでした。それらはすべて同じ周期(1マイクロ秒)を持ち、時間/呼び出しは実質的に同じです。 3種類のクロックを同じにするとどういう意味ですか?chrono
のG ++実装はまだ成熟していないからですか?あるいは、3.1.10カーネルにはユーザーアクセス可能なクロックが1つしかないかもしれませんか?
2番目の驚きは、これは巨大です、それはsteady_clock :: is_steady == falseです。私は、定義上、そのプロパティが真でなければならないことをかなり確信しています。何を与える?どのように私はそれを回避することができます(つまり、安定したクロックを達成する)?
他のプラットフォーム/コンパイラで簡単なプログラムを実行できるのであれば、結果を知りたいと思うでしょう。誰もが疑問に思っているならば、それは私のCore i7の上の約25ナノ秒/反復だ、1000のNS /イテレーションのTegra 2.
の3つのクロックタイプすべてについてのコメント)私は '-DXXX'フラグで指定されている時計の種類ごとにコードを3回コンパイルしています。 'g ++'の最後の引数は、実行可能ファイルのファイル名だけです。これは、リックには関係ありません。 (私はそれがどの種類の時計とプログラムがクロノライブラリを使っているのかを反映しています) –
申し訳ありませんが、私は完全にコマンドラインを誤読しました –