プロファイル事始-その2

さて、前回の続きです。最近風邪をこじらせて死にそうになりながらキーボードをたたいています。
なぜかやめられないんですよね。プログラミングって。
ちなみに高3〜大学1回生のときはあまりプログラミングをしていなかった時期もあったのですが、また徐々に熱は取り戻されてしまうんですね。どうでもいいことですが。

今回のお話はWindows上での時刻のとり方の、泥臭いところをお話します。なぜOpenOfficeの話なのにWindows限定かといわれると、まぁ、それは今これを書いているのがWindows上だからです。Linuxも入ってるんですが、あっちの開発経験があまり無いので、OO上にどう実現したら良いのか分からないところがあったりするんです。というわけでWindowsじゃない人は吸いません。

まず今回はWin32APIを利用した時刻のとり方をお話します。OOoBasicはDLLプロシージャの呼び出しをサポートしているので、もちろんAPIを利用することができます。
で、ゲームなんかを作ったことをある方は先刻承知だと思いますが、Windowsにはいくつかタイマがあります。GetTickCount,timeGetTime,QueryPerformanceCounterぐらいがまぁ、普通に有名で、DirectMusicにもタイマがあったりしますが、まぁ、あれは今回は良いでしょう。
各タイマの分解能についてはこちらを参照してください。

Declare Function GetTickCount Lib "kernel32.dll" Alias "GetTickCount" () As Long
こういう感じに宣言できます。ああ、使い終わったdllは
FreeLibrary("kernel32.dll" )
と、開放してやる必要性があるので注意してください。

で、まぁ、手軽さでは正直GetTickCountが一番でしょうねぇ。何にも考えなくていいので。timeGetTimeは実は問題?がありまして、分解能がNT系のOSだと初期設定が10msとかになっているのです。この場合、timeBeginPeriodとtimeEndPeriodで設定を変更してやる必要性があります。設定を変更すれば大体の場合で1msの分解能で利用できます。

timeBeginPeriod(1)
処理
timeEndPeriod(1)

とね。本当はそのシステムが設定可能な最小の分解能はtimeGetDevCapsというAPIで取得できます。まぁ、こうやっていくとだんだん面倒くさくなってくる、と。
本当はtimeGetTimeのほうが安定的に取得できるんですがね。ちょっとGetTickCountより重いですが、コールする回数考えるとたいしたオーバーヘッドではないですね。

QueryPerformanceCounterは、まあ悪くはないです。パフォーマンス測定に使われますしね。ただ、まぁほかの二つに比べて単位が直感的ではない気もしますが、一般にベンチマークは相対値が問題になるので、この辺はいいでしょう。ただ、たしかこのAPIWindows98から追加された比較的新しいAPIだったと思うのでって、もうぜんぜん新しくないですね。

ええっと、つまり何が言いたいのかといいますと、どれも似たようなものなんだから好きなのを使ったらいいじゃないっ!