Last Updated 2002/10/17
週刊Bravo!! > Programing Tips > Visual C++ > API

QueryPerformanceCounter


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

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

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

2000/10/17

参照
マルチメディアタイマー


週刊Bravo!! > Programing Tips > Visual C++ > API

感想要望などを下記メールアドレスまでお願いします.
前向きなメールがこれからを左右します.(^^)

DSSへメールを送る