WindowsはいくつかのTimerを提供しています。
- Multimedia Timer
- Timer Queue
- Threadpool Timer
- 同期オブジェクトを使用するWaitable Timer
- メッセージループを使用するMessage Timer
があり、それぞれに特徴があります。
- Message Timerは分解能が16msなので精度はよくない。
- Multimedia Timerは廃止済みでTimer Queueを推奨している。
- Multimedia TimerはtimeBeginPeriodを呼ぶことで精度が向上する。
などはよく知られていると思います。しかし実際どうなっているのか気になって調べたところOn WinAPI timers and their resolutionという比較記事を見つけました。しかしOSバージョンが明示されていないなど疑問は解消しなかったため、自分で比較してみることにしました。
比較コードおよびWindows 7、Windows 8.1、Windows 10での測定結果をgistにまとめました。その結果、いろいろなことがわかりました。
- Message Timerは依然として分解能16msのままである。
- Multimedia TimerはtimeBeginPeriodを呼ばなくても精度がよい。
- むしろTimer Queues、Threadpool Timer、Waitable TimerこそtimeBeginPeriodの影響を受けている。
- Timer QueuesとThreadpool TimerはWindows 7ではMultimedia Timerに依存していたようで精度がよかったが、Windows 8以降でtimeBeginPeriodを呼ばない場合はMessage Timer相当に精度が下がる。更にWindows 10ではtimeBeginPeriodを呼んだ場合でも多少精度が下がる。
- Waitable TimerもtimeBeginPeriodを呼ばない場合はMessage Timer相当に精度が下がる。
結論としては、Windows 10時代においてもMultimedia Timer安定でしょうか。
0 件のコメント:
コメントを投稿