高分解能パフォーマンスタイマーを提供する.(マイクロ秒)
---------------------------------------------------------------------------
TCHAR szBuffer[128];
LARGE_INTEGER liPerfFreq = {0, 0};
LARGE_INTEGER liPerfCount = {0, 0};
if(QueryPerformanceCounter(&liPerfCount)) {
TCHAR szCounter[28]; //指数のためのスペースを含める
double dCounter = (double)liPerfCount.LowPart +
(double)liPerfCount.HighPart * (double)0xFFFFFFFFFFFFFFFF;
QueryPerformanceFrequency(&liPerfFreq);
wsprintf(szBuffer, "Count:%s,Resolution:%lu",
gcvt(dCounter, 20, (char *)szCounter), liPerfFreq.LowPart );
}
---------------------------------------------------------------------------
QueryPerformanceCounter()はシステム起動からの経過時間(msec)を符号なしの64ビット値で取得する.
QueryPerformanceFrequency()はパフォーマンスカウンタの1秒当たりのインクリメントの回数を格納するLARGE_INTEGER(64bit)へのポインタを引数にもつ.
QueryPerformanceFrequency()のLowPart部の値が1秒間にインクリメントされるカウント値なので
double time;
DoubleWord freq;
QueryPerformanceFequency( &freq );
time = (double)1.0 / (double)freq.LowPart;
time = time * 1000000.0
とすればtimeにはマイクロ秒の値が取得できる.
もしProc()という関数の処理時間を測りたい場合
QueryPerformanceCounter( &liStart );
Proc();
QueryPerformanceCounter( &liFinish );
QueryPerformanceFequency( &freq );
time = (double)(liFinish.QuadPart - liStart.QuadPart) / (double)liFreq.QuadPart;
// HighPart を無視するなら
// time = (double)(liFinish.LowPart - liStart.LowPart) / (double)freq.LowPart;
とすれば処理時間を取得できる.
参照
マルチメディアタイマー