2005-11-28
_ [技術系][Web制作]タイマー精度その後
Windows IE JavaScript のタイマーは精度が悪いについての反応と追記。
これは多分Windowsの
SetTimer
API (WM_TIMER
)を使ってるのでしょうね。実際、Googleで検索すると見つかるタイマー(WM_TIMER)の精度というページにあるソースをコンパイルして、実行して結果を眺めると大体そんな感じになります(10ms*100が15000msだったり)。
Operaも
IE互換というかその方法なのだと思います。まあ、だからどうしたということでもないのですが。
引用元: ぷろじぇくと、みすじら。2005/11/26 - Sat
とここまでは「なるほど」だったのですが、Macintosh(OS X)とWindowsの違ひつて事みたい。
と反応されてしまって「しまった」と思いました。
Firefox 1.0.7 での計測を IE での計測と同じ PC で行うと結果は次のようになります。
6ms / 1734 / 17.34 8ms / 1891 / 18.91 10ms / 1890 / 18.9 12ms / 1891 / 18.91 14ms / 1891 / 18.91 16ms / 1906 / 19.06 18ms / 1906 / 19.06 20ms / 2016 / 20.16 22ms / 2219 / 22.19 24ms / 2421 / 24.21 26ms / 2610 / 26.1 28ms / 2812 / 28.12 30ms / 3016 / 30.16 32ms / 3219 / 32.19 34ms / 3422 / 34.22 36ms / 3609 / 36.09 38ms / 3812 / 38.12 40ms / 4016 / 40.16 42ms / 4219 / 42.19 44ms / 4422 / 44.22 46ms / 4625 / 46.25 48ms / 4828 / 48.28 50ms / 5015 / 50.15 52ms / 5219 / 52.19 54ms / 5422 / 54.22 56ms / 5625 / 56.25 58ms / 5828 / 58.28 60ms / 6016 / 60.16
どの設定間隔でも 0.2ms 前後間隔が広くなっていますが、設定間隔に追随してはいます。ですので問題は仕様が要求する精度に応えられない API を使用している IE と Opera にあって、 OS の問題ではないと考えられます。
完璧に対比する相手を間違えました。 IE の精度が良くないと言うことしか考えてなかったので、一番手近にあって IE よりまともな結果が出たというだけで Safari の結果を載せてしまいました(別に Mac マンセーとも Safari 万歳と言うつもりもない)。指摘したい点以外は極力差異を抑えるのはこういう対比の基本なのにね。要らぬ勘違いを引き起こしてしまってごめんなさい。
ついでに Safari で測定を行ったのと同じ Mac で Firefox 1.0.7 での計測を行うとこんな結果になります。
6ms / 1384 / 13.84 8ms / 1419 / 14.19 10ms / 1458 / 14.58 12ms / 1368 / 13.68 14ms / 1413 / 14.13 16ms / 1601 / 16.01 18ms / 1799 / 17.99 20ms / 2000 / 20 22ms / 2200 / 22 24ms / 2401 / 24.01 26ms / 2602 / 26.02 28ms / 2802 / 28.02 30ms / 3001 / 30.01 32ms / 3201 / 32.01 34ms / 3400 / 34 36ms / 3601 / 36.01 38ms / 3801 / 38.01 40ms / 4001 / 40.01 42ms / 4201 / 42.01 44ms / 4401 / 44.01 46ms / 4601 / 46.01 48ms / 4802 / 48.02 50ms / 5000 / 50 52ms / 5200 / 52 54ms / 5401 / 54.01 56ms / 5600 / 56 58ms / 5801 / 58.01 60ms / 6001 / 60.01
16ms 以降はほぼ設定間隔通りの間隔で実行できています。
長くなりますけど Mac 版 Internet Explorer 5.2 での結果も貼っておきます。
6ms / 703 / 7.03 8ms / 842 / 8.42 10ms / 1064 / 10.64 12ms / 1234 / 12.34 14ms / 1465 / 14.65 16ms / 1673 / 16.73 18ms / 1874 / 18.74 20ms / 2049 / 20.49 22ms / 2275 / 22.75 24ms / 2471 / 24.71 26ms / 2674 / 26.74 28ms / 2867 / 28.67 30ms / 3046 / 30.46 32ms / 3237 / 32.37 34ms / 3488 / 34.88 36ms / 3677 / 36.77 38ms / 3837 / 38.37 40ms / 4039 / 40.39 42ms / 4310 / 43.1 44ms / 4458 / 44.58 46ms / 4669 / 46.69 48ms / 4855 / 48.55 50ms / 5062 / 50.62 52ms / 5253 / 52.53 54ms / 5482 / 54.82 56ms / 5663 / 56.63 58ms / 5841 / 58.41 60ms / 6080 / 60.8
設定間隔に比べ 1ms 近く間隔が広がっています。
結局のところ、ブラウザで実装されてる JavaScript のタイマーは全般的に信用ならないってことですか。