○パフォーマンス測定用のストップウオッチ

いかに正確な時間が計れるかということですが、精度の順から言うと

GetLocalTime
timeGetTime
QueryPerformanceCounter
CPUクロックから算出?

の順で精度が高くなる気がします。
なんかもっとよい方法が無いのだろうか?

■まずはGetLocalTime

//パフォーマンス測定用のストップウオッチクラス
//環境により精度が変化します。
//
//使い方
//このファイルを 取り込んでください。
//	#include "Stopwatch.h"
//
//
//	Stopwatch wc;
//	wc.start();//計測開始
//
//	//ここに測定したい処理がはいります。
//
//	long t=wc.now();//start()からの経過時間を1/1000秒にて出力
//	TRACE("%d\n",t);//表示
//

class Stopwatch{
private :
	UINT64 startTime;
	UINT64 stopTime;
public :
	void start(void);
	long now(void);
};

void Stopwatch::start(void){
	SYSTEMTIME st;
	GetLocalTime(&st);//現在の時刻を取得
	SystemTimeToFileTime(&st,(FILETIME *)&startTime);//時間→数値
}

long Stopwatch::now(void){
	SYSTEMTIME st;
	GetLocalTime(&st);//現在の時刻を取得
	SystemTimeToFileTime(&st,(FILETIME *)&stopTime);//時間→数値
	return (long)((stopTime-startTime)/(10*1000));
}



■でもGetLocalTimeはあんまり精度がないから
もう少し精度が必要ならtimeGetTimeがいいかも。

timeBeginPeriod(1);//最小タイマ分解能を1ミリ秒で指定
unsigned long _start=timeGetTime();

時間を計る処理

unsigned long _end=timeGetTime();
timeEndPeriod(1);//最小タイマ分解能をクリア


■timeGetTimeより精度の高いQueryPerformanceCounter
もっと精度が高いそうです。

LARGE_INTEGER freq;
LARGE_INTEGER overhead;
LARGE_INTEGER start;
LARGE_INTEGER end;

freq.QuadPart=0;
start.QuadPart=0;
end.QuadPart=0;

QueryPerformanceCounter(&start);
QueryPerformanceCounter(&end);
overhead.QuadPart=end.QuadPart-start.QuadPart;

QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&start);

時間を計る処理

QueryPerformanceCounter(&end);

printf("%d micro second\n",(int)((end.QuadPart-start.QuadPart-overhead.QuadPart)*1000*1000/freq.QuadPart));


てゆうかこんなものよりもCPUクロックをカウントしたりとかしたほうが
はるかに正確のような気がします。
時間の精度までHALが吸収してくれませんから。

CPUクロックを求める

なによりも自分のパソコンの正確なクロックを調べないといけないですねw
正確な時間をもとめるにはもっと機械寄りにならないといけないんでしょうね。



▲トップページ > Windows と C++