Last Updated 2000/10/17
Programming Tips Visual C++ API  索 引 
QueryPerformanceCounter
2000/10/17

高分解能パフォーマンスタイマーを提供する.(マイクロ秒)

---------------------------------------------------------------------------
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;

とすれば処理時間を取得できる.


参照
マルチメディアタイマー
前後のTips
QueryPerformanceCounter

DSS ProgrammingTipsCGI Ver2.02