QueryPerformanceCounter 【やってみた】


SoundEngineやImage Noteでは若干時間のかかる処理がある。それでも、昔なら膨大な時間がかかったものだが、最近はCPUなどの性能が飛躍的に向上し処理時間がかなり短くなった。

パフォーマンス改善のために昔は、よくGetTickCountやtimeGetTimeなどで処理時間を計ったりしたものだが、最近ではQueryPerformanceCounterを使うようだ(というより最近知っただけ)。今回はこれについてちょっと実験してみようかと。

スポンサーリンク

QueryPerformanceCounter

必要なヘッダーは、windows.hだけのようだ。#include <windows.h>してあげればとりあえず、LARGE_INTEGERもQueryPerformanceCounterもQueryPerformanceFrequencyも使える。とりあえず、こんなコードを作ってみた。

[c]
LARGE_INTEGER freq;
LARGE_INTEGER begin;
LARGE_INTEGER end;

QueryPerformanceFrequency( &amp;freq );
QueryPerformanceCounter( &amp;begin );

Sleep( 1000 );

QueryPerformanceCounter( &amp;end );

printf( "%f\n", ( double )( end.QuadPart – begin.QuadPart ) / freq.QuadPart );
[/c]

結果は、こんな感じになった。

result.gif

どうやらうまく行ったようだ。(若干、Visual C++でDebugモードの方がReleaseモードより遅くなる点は研究したいところであるが今回はしない。)

さて、QueryPerformanceFrequencyですが、カウンタの周波数とのことらしい。ただ、一体なんの値なのかはよくわからない。自分の環境(CPU 900MHz(Crystal CPUIDでは、896.68MHz))では、3579545であった。およそ4000倍ぐらい。

そんなわけで、3579545をGoogleで検索してみたところ、

※3,579,545Hzは、ACPIタイマー由来の値。この周波数はテレビ放送のNTSCの色副搬送波周波数でもある(発振器が安く、入手しやすい)。

とのことである。(引用元 TORO’s Data Library(Win32 API memo))
これでやっと心置きなく使えそうな気はする。ありがとうございました。

環境

ちなみにこれらの関数は、ハードウェアがサポートしていない場合使えないようだ。ただ、関数としては、kernel32.dllにありWindows 95, Windows NT 3.1から使えるようなのでリンクする分には問題なさそうである。また、MSDNでは、

The frequency cannot change while the system is running.

と書いているので、システム動作中はこの周波数は変えることが出来ないとのこと。

また、時間ではなくクロック数を取得するrdtscについても後で説明する。

スポンサーリンク
カテゴリー: やってみた   パーマリンク

QueryPerformanceCounter への2件のコメント

  1. ピンバック: C++ mutable、volatileの使い方・速度 | 豆知識

  2. ピンバック: rdtsc(Read Time Stamp Counter)のクラス化 | 豆知識