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( &freq );
QueryPerformanceCounter( &begin );
Sleep( 1000 );
QueryPerformanceCounter( &end );
printf( "%f\n", ( double )( end.QuadPart – begin.QuadPart ) / freq.QuadPart );
[/c]
結果は、こんな感じになった。
どうやらうまく行ったようだ。(若干、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についても後で説明する。
ピンバック: C++ mutable、volatileの使い方・速度 | 豆知識
ピンバック: rdtsc(Read Time Stamp Counter)のクラス化 | 豆知識