2

C++ コードをできるだけ正確に測定する方法が欲しいです。ブーストには高解像度のクロックがあることがわかりましたが、ブーストのドキュメントには、パフォーマンスの点で高価なクロックであると書かれています。

http://www.boost.org/doc/libs/1_47_0/doc/html/chrono/users_guide.html

他にどのような方法がありますか?CPUサイクルで測定する方法はありますか??

4

4 に答える 4

2

GCC を使用している場合は、GNU プロファイラー (gprof) http://sourceware.org/binutils/docs/gprof/を試してください。Gprof はおそらく最も正確な結果を提供します。

関数の開始時間と終了時間の差をとることは、コンテキストの切り替え (b/w プロセスまたはスレッド) により精度が低下します。

于 2012-12-06T15:09:48.577 に答える
1

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 & );
};
于 2012-12-06T14:37:00.233 に答える
1

これが Windows でのプロファイリング用である場合は、CPU で正確であれば rdtsc 命令を使用します (議論については、RDTSC が一定レートのカウンター値を返すかどうかを検出する方法を参照してください)。QueryPerformanceCounter よりもはるかに高速です。

于 2012-12-06T14:53:10.693 に答える
1

あなたの質問からは、外部または内部のプロファイリングが必要かどうかわかりません。

外部プロファイリングの場合、Windows には Quantify (またはその後継) があり、g++ を使用する UNIX には gprof があります。Solaris を使用している場合は、実行中のアプリケーションに接続して統計プロファイリングを行うことができる dtrace もあります。

内部プロファイリングを探している場合、gettimeofdaySolaris/Linux では、タイトなループ内を除いて、十分なパフォーマンスが得られるはずです。

于 2012-12-06T14:54:23.670 に答える