タイマ問題
前のつづき。
よく考えたらタイマ関係の分解能をきちんと調べたことがほとんどなかったような気がしたので、ちょっとやってみた。
サンプルプログラム : win32timercaps.zip
で、手元の環境(Win98SE)だと
- timeGetDevCaps によるタイマ最小分解能は 1ms
- GetTickCount の増分は 1ms 単位(あれ、50ms じゃないんだ?)
- timeGetTime の増分も 1ms 単位
- ただし、ときどきつんのめったように 10〜20ms ぐらい間があくことがある。GetTickCount より timeGetTime のほうがつんのめり時間は相対的に短いようだが、正直どっちもどっち。
- timeSetEvent はきっちり 1ms 単位でコールバックできるようだ
- _ftime は 50ms 単位の増分しか取れない。GetTickCount は 1ms 単位で取れるのに…
こんな感じでした。
結果は動作環境によって異なる可能性があります。(ちなみに、NT3.5 時代の古い SDK ヘルプには「タイマの精度は、 Intel(R) システムでは16ミリ秒まで、 MIPS(R) システムでは10ミリ秒までです」と書かれています)
…とりあえず qemu 的には、_ftime 使ってるとこを GetTickCount か timeGetTime に直す方向で……
タイマ問題つづき
初代 Win95 が入っているノート(486DX4-100) があったので、試してみた。
query periodic capabilities... Minimum Periodic Resolution 1ms Maximum Periodic Resolution 65535ms testing GetTickCount resolution... Minimum Periodic Resolution 6ms Maximum Periodic Resolution 41ms Average Periodic Resolution 14.337243ms testing timeGetTime resolution... Minimum Periodic Resolution 1ms Maximum Periodic Resolution 15ms Average Periodic Resolution 1.036168ms testing timeSetEvent resolution (per 1ms)... Minimum Periodic Resolution 0ms Maximum Periodic Resolution 5ms Average Periodic Resolution 0.999022ms 50ms sleep ... 55ms
んー、GetTickCount のほうが timeGetTime よりだいぶ「粗い」みたい。