タイマの精度

CEではなくx86のお話。
もう去年になりますか、客先のプログラムの動作がおかしいということで調べてみると、どうやらタイマの精度が正しくないということがわかりました。
対策を立てるために客先からドライバ開発ベンダーやMSに問い合わせのメールを送るも誤差が生じているなどあまりにも不明瞭な回答が…*1

こちらでも動かないと埒があかないと思って、問題が発生しているマシンのメーカにも質問を出したら以下のような回答が帰ってきました。

あまりにも他がダメダメだったのでこのサポートの回答には惚れてしまいました。
やはり日本のメーカーだぜとか言いたくもなりますが、ノートPCのようにH/Wの設計をしっかりやっているメーカーはすごいと思わざるをえません。

この動作の原因は、Windows XP のハードウェア アブストラクションレイヤ モジュール:HAL.DLL の仕様の違いによるものであり、そのPCが使用しているHALの種類によってタイマ精度が決まります。

タイマ精度 約 10mS となるマシンは halacpi.dll が使用されており、タイマ精度 16mS となるマシンには halaacpi.dll が使用されております。

最近の機種では、割り込みコントローラに APIC (Advanced PIC) を 使用しておりまして、この場合、HAL は halaacpi.dll が使用されます。

また、比較的古い機種の多くは、割り込みコントローラに PIC (Programmable Interrupt Controller) を使用しておりまして、 この場合、HAL は halacpi.dll が使用されます。

これらの HAL は PC のタイマハードウェアを制御し、 それぞれのタイマ精度の設定値が異なりますため、 ご指摘いただいております現象となります。

以下の2つの操作で、その違いを見分けることができます。

●操作1
Windows\System32 フォルダにございます HAL.DLL のプロパティにて、「正式ファイル名」を参照していただくと、上記のどちらの HAL を使用しているかが分かります。

●操作2
コントロールパネルのシステム アプレットにて、[ハードウェア] タブの[デバイス マネージャ] をクリックし、[コンピュータ] の下に表示されるデバイス名を確認していただきますと、以下のデバイスのどれかが表示されます。

ACPI マルチプロセッサ PC = Halmacpi.dll
ACPI ユニプロセッサ PC = Halaacpi.dll
ACPI (Advanced Configuration and Power Interface) PC = Halacpi.dll
MPS マルチプロセッサ PC = Halmps.dll
MPS ユニプロセッサ PC = Halapic.dll
標準 PC = Hal.dll
Compaq SystemPro マルチプロセッサまたは 100% 互換性がある PC = Halsp.dll

マルチプロセッサおよび APIC の機種でのタイマー精度は、通常約 16ms となります。
(この値も、ハードウェアやデバイスドライバの実装に依存するため、保証は難しくなります)

というわけで、Vistaでは変わっているかも知れませんが、16msあたりがタイマの精度のようです。
HALってこういうのも吸収するんじゃないのと思っていたのですが、Windowsな世界の方々は誤差なんでしょうかね。

*1:MSに問い合わせたかはわかりませんが