[解決済み] C++でナノ秒単位の時間を提供するタイマ機能
質問
あるAPIが値を返すのにかかった時間を計算したい。 そのようなアクションにかかる時間は、ナノ秒のスペースです。APIはC++のクラス/関数であるため、私は同じことを計算するためにtimer.hを使用しています。
#include <ctime>
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
clock_t start;
double diff;
start = clock();
diff = ( std::clock() - start ) / (double)CLOCKS_PER_SEC;
cout<<"printf: "<< diff <<'\n';
return 0;
}
上記のコードでは秒単位で時間が表示されます。どうすれば同じものをナノ秒単位で、より正確に得ることができるでしょうか?
どのように解決するのですか?
他の方が投稿されている、関数をループで繰り返し実行する方法は正しいです。
Linux (および BSD) の場合は clock_gettime() .
#include <sys/time.h>
int main()
{
timespec ts;
// clock_gettime(CLOCK_MONOTONIC, &ts); // Works on FreeBSD
clock_gettime(CLOCK_REALTIME, &ts); // Works on Linux
}
ウィンドウズでは QueryPerformanceCounter . そして、ここでは、さらに QPC
どうやら既知の 問題 の問題があることが知られています。さらに、一部のデュアル コア AMD では、QPC が原因で 問題 . sebbbi による 2 番目の投稿を参照してください。
QueryPerformanceCounter() と QueryPerformanceFrequency() は、もう少し解像度の高い はもう少し良い解決策を提供しますが、異なる問題があります。 とは異なる問題があります。たとえば Windows XPでは、すべてのAMD Athlon X2デュアルコアCPUは、いずれかのPCを返します。 コアCPUは、どちらかのコアのPCを返します。 コアのどちらかのPCを返します。 を返します(PCが少し後ろにジャンプすることもあります)。 AMDデュアルコアドライバを特別にインストールする パッケージのインストールが必要です。我々は 他のデュアル+コアCPUでは 同様の問題がある他のデュアルコアCPU(P4 dual, P4 ht, core2 dual、core2 quad、phenom quad)。
2013/07/16に編集しました。
にあるように、特定の状況下でのQPCの有効性については賛否両論あるようです。 http://msdn.microsoft.com/en-us/library/windows/desktop/ee417693(v=vs.85).aspx
...QueryPerformanceCounter および QueryPerformanceFrequency は通常、複数のプロセッサ用に調整されます。 BIOS やドライバーのバグにより、スレッドがあるプロセッサーから別のプロセッサーに移動すると、これらのルーチンが異なる値を返すことがあります。 BIOS やドライバーのバグにより、スレッドが 1 つのプロセッサから別のプロセッサに移動すると、これらのルーチンが異なる値を返す可能性があります。
しかし、この StackOverflow の回答は https://stackoverflow.com/a/4588605/34329 は、Win XP サービス パック 2 以降のすべての MS OS で QPC が問題なく動作することを述べています。
この記事では、Windows 7 がプロセッサに不変の TSC があるかどうかを判断し、ない場合は外部タイマーにフォールバックすることを説明しています。 http://performancebydesign.blogspot.com/2012/03/high-resolution-clocks-and-timers-for.html プロセッサ間で同期をとることはまだ問題です。
タイマーに関連するその他の細かい読み物。
- https://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks
- http://lwn.net/Articles/209101/
- http://performancebydesign.blogspot.com/2012/03/high-resolution-clocks-and-timers-for.html
- QueryPerformanceCounter のステータス?
詳しくはコメントをご覧ください。
関連
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】C++の余分な資格エラー
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] System.nanoTime()は全く使えないのか?