2005-11-24
_ [技術系][Web制作] Windows IE JavaScript のタイマーは精度が悪い
先ほど公開した「跳べ! ノミ野郎」の制作時にちょっと気になったので検証ページを作ってみました。
JavaScript で使用できるタイマー機能の1つに setInterval というのがありまして、指定した命令を指定した間隔を置いて実行してくれます。このページではこの精度の測定を行っています。 start ボタンをクリックすると設定間隔 6ms から 60ms まで測定を行い、「設定間隔 / 100回繰り返すのにかかった時間 / 実際の間隔」の順で結果を出力します。
当然ながら「設定間隔」と「実際の間隔」が等しくなることが理想です。
Safari 2.0.2 だと結果はこんな感じ。
6ms / 792 / 7.92 8ms / 800 / 8 10ms / 1011 / 10.11 12ms / 1201 / 12.01 14ms / 1484 / 14.84 16ms / 1632 / 16.32 18ms / 1800 / 18 20ms / 2000 / 20 (中略) 60ms / 6000 / 60
8ms 以降では設定間隔と実際の間隔との誤差は 1ms 以内に収まっており、この誤差であれば実用上ほぼ問題ないでしょう。
それに対して Windows の Internet Explorer 6.0 だと結果は下のように。
6ms / 1562 / 15.62 8ms / 1578 / 15.78 10ms / 1563 / 15.63 12ms / 1562 / 15.62 14ms / 1563 / 15.63 16ms / 2937 / 29.37 18ms / 3125 / 31.25 20ms / 3125 / 31.25 22ms / 3125 / 31.25 24ms / 3125 / 31.25 26ms / 3125 / 31.25 28ms / 3125 / 31.25 30ms / 3125 / 31.25 32ms / 4625 / 46.25 34ms / 4688 / 46.88 36ms / 4687 / 46.87 38ms / 4688 / 46.88 40ms / 4687 / 46.87 42ms / 4688 / 46.88 44ms / 4687 / 46.87 46ms / 4688 / 46.88 48ms / 6250 / 62.5 50ms / 6250 / 62.5 52ms / 6250 / 62.5 54ms / 6250 / 62.5 56ms / 6250 / 62.5 58ms / 6250 / 62.5 60ms / 6250 / 62.5
大ウソつきですね。実際の間隔の飛び具合から見て内部で 1/64 秒(15.625ms)単位に置き換えていると考えられます。 IM で呼びかけて友人数人にテストしてもらっても同様の結果が出たのでマシン依存ではなくブラウザの問題で間違いないでしょう。
そんなわけですので、 JavaScript で小さい間隔のタイマーを使おうと考えている人は十分気をつけてください。
という記述ぐらい絶対探せば落ちてるんだろうなぁと思いつつ、結局自分で書いたのでありました。
別エントリとして追記しました。比較対象が少なく誤解を招くことがあったので更に比較対象を掲載しています。