最終更新 2004 06/01
サンプルのダウンロード → API_QueryPerformanceCounter.lzh(44k)
全ソースコード
QueryPerformanceCounter 関数
QueryPerformanceFrequency 関数
対応しているバージョン
95, 98, Me, NT3.0以降, 2000, XP
使用するヘッダとライブラリ
winbase.h
kernel32.lib
|
timeGetTime() よりも更に高い精度の時間を計測するには
QueryPerformanceCounter() 関数を使います。
高分解能パフォーマンスカウンターと呼ばれているようで、ミリ秒をさらに
1/1000以上?に分解した時間を計測することができます。
QueryPerformanceCounter() 関数を使用して時間を計測する前に、システムが
高分解能パフォーマンスカウンターをサポートしているかを調べます。
サポートしているかどうかは QueryPerformanceCounter() 関数の戻り値を
調べます。
戻り値が0以外ならサポートしていて、0はサポート外なので使用できません。
時間を計測する時は、高分解能パフォーマンスカウンターをサポートしているなら
QueryPerformanceCounter() 関数を使って計測して、サポートしていないなら
timeGetTime() で時間を計測するというような流れになると思います。
QueryPerformanceCounter() 関数の引数には LARGE_INTEGER という構造体の
ポインタを指定します。
関数が成功すると、この構造体の QuadPart メンバに高分解能パフォーマンス
カウンターの現在の値が格納されて返ってきます。
QuadPart は64ビット(LONGLONG)型のメンバ変数です。
LARGE_INTEGER large_int;
QueryPerformanceCounter( &large_int );
long time = (long)large_int.QuadPart;
サンプルのように計測する時間が1秒に満たない場合は、時間を受け取る変数は
LONGLONG 型でなく、上記のように long 型にキャストして QuadPart の値を
切り詰めてしまっても問題ありません。
この QueryPerformanceCounter() で取得できる値は、パフォーマンスカウンターの
カウンターの値なので、これをミリ秒に変換するには QueryPerformanceFrequency()
を使って、1秒あたりの周波数を取得します。
LARGE_INTEGER counter;
//開始値を取得
QueryPerformanceCounter( &counter );
long start = (long)counter.QuadPart;
/*
処理〜
*/
//終了値を取得
QueryPerformanceCounter( &counter );
long end = (long)couner.QuadPart;
//値の差を計算
long past = end - start;
//値をミリ秒に変換
LARGE_INTEGER freq;
QueryPerformanceFrequency( &freq );
long msec = past / ( (long)freq.QuadPart / 1000 );
//表示
printf( "処理時間(msec):%d", msec );
1秒あたりの周波数を1000で割れば、1ミリ秒あたりの周波数が分かるので
カウンターの値を 周波数/1000 で割れば、カウンターの値をミリ秒に変換できます。
|