2007年02月

2007年02月11日

実行時間を測定するPerformanceクラス

プログラムを書いていて一部の処理の実行時間が問題になることがあります。
EX68ではIntelのパフォーマンスアナライザVTUNEの評価版を使って
全てのインストラクションをクロック単位で調べる事ができました。
最近も簡単に調べたいと思う時が有ったので、次に使えるよう纏めておきます。
IntelのCPUにはリセットからカウントアップする64ビットのカウンターが内蔵
されていて、それを読み出すAPIがwindowsに用意されています。
結果はマイクロ秒単位で表示します。
windows以外でライブラリの用意が無ければasm文として記述しなければなりません。
ファイルはperformance.hとしてincludeしておく

#pragma once
#include 

/*kernel32.libをリンクする*/

class CPerformance
{
private:
	LARGE_INTEGER Freq;
	LARGE_INTEGER PreCount;
	LARGE_INTEGER PostCount;
	BOOL Active;
public:
	CString sResult;
public:
	CPerformance(void){
		if(::QueryPerformanceFrequency(&Freq)){
			Active = TRUE;
		}else{
			Active = FALSE;
		}
	};
	~CPerformance(void) {};
	void Pre() { ::QueryPerformanceCounter(&PreCount); };
	void Post() { ::QueryPerformanceCounter(&PostCount); };
	void Result() {if(Active) sResult.Format("Time: %.fus", (PostCount.QuadPart - PreCount.QuadPart) * 1000000.0 / Freq.QuadPart); };
};

使うときは以下のように
void Test()
{
	CPerformance perf;

	perf.Pre();    //処理前のカウンタ
      TestRoutine(); //測定したいコード
     	perf.Post();   //処理後のカウンタ
	perf.Result(); //結果を計算する。マイクロ秒単位
	::SetWindowText(NULL, perf.sResult); 
}