C++ コードをできるだけ正確に測定する方法が欲しいです。ブーストには高解像度のクロックがあることがわかりましたが、ブーストのドキュメントには、パフォーマンスの点で高価なクロックであると書かれています。
http://www.boost.org/doc/libs/1_47_0/doc/html/chrono/users_guide.html
他にどのような方法がありますか?CPUサイクルで測定する方法はありますか??
C++ コードをできるだけ正確に測定する方法が欲しいです。ブーストには高解像度のクロックがあることがわかりましたが、ブーストのドキュメントには、パフォーマンスの点で高価なクロックであると書かれています。
http://www.boost.org/doc/libs/1_47_0/doc/html/chrono/users_guide.html
他にどのような方法がありますか?CPUサイクルで測定する方法はありますか??
GCC を使用している場合は、GNU プロファイラー (gprof) http://sourceware.org/binutils/docs/gprof/を試してください。Gprof はおそらく最も正確な結果を提供します。
関数の開始時間と終了時間の差をとることは、コンテキストの切り替え (b/w プロセスまたはスレッド) により精度が低下します。
Windows では、QueryPerformanceCounter() を使用します。
Solaris では gethrtime() を使用します。
他の UNIX では、gettimeofday() を使用します。
もちろん、それらをクラスにラップして、コードがクラスのみを使用し、メソッドを直接使用しないようにする必要があります。
次のようなクラスを使用します
class dbbHighResTimer {
public:
dbbHighResTimer(); // Does call set()
dbbHighResTimer( int ); // Does not call set()
void set();
friend double operator - ( const dbbHighResTimer &, const dbbHighResTimer & );
friend int compare( const dbbHighResTimer &, const dbbHighResTimer & );
};
これが Windows でのプロファイリング用である場合は、CPU で正確であれば rdtsc 命令を使用します (議論については、RDTSC が一定レートのカウンター値を返すかどうかを検出する方法を参照してください)。QueryPerformanceCounter よりもはるかに高速です。
あなたの質問からは、外部または内部のプロファイリングが必要かどうかわかりません。
外部プロファイリングの場合、Windows には Quantify (またはその後継) があり、g++ を使用する UNIX には gprof があります。Solaris を使用している場合は、実行中のアプリケーションに接続して統計プロファイリングを行うことができる dtrace もあります。
内部プロファイリングを探している場合、gettimeofday
Solaris/Linux では、タイトなループ内を除いて、十分なパフォーマンスが得られるはずです。