更に精度の良い方法

最終更新 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 で割れば、カウンターの値をミリ秒に変換できます。

| back | home |