« ブロードバンド時代にナローバンドに対応する方法(シミュレーション方法) | トップページ | Konquerorで画像の入れ替えJavascriptで不具合が発生するケース »

2005/10/09

MacIE+Tiger: getTime()で時間を正しく取得できない現象(キャッシュの影響が原因?)

<script>
s=1128679263484;
s3=(new Date()).getTime();
alert(eval((s3-s)/1000));
</script>

これは、ある基準値となる時間(ほぼ2005年10月7日19時1分3秒)からの経過時間(秒数)を求めるJavascriptである。1000で割っているのは、getTime()で得られる値が1970年1月1日から経過したミリセカンド(1秒=1,000ミリセカンド)だからだ。

この極めて単純なJavascriptもMacIE5.2.3(Tiger)では見事にバグります。MacIEで最初に表示させた場合には、他のブラウザ(SafariやFirefoxなど)での計算結果と同じなのですが、時間の経過とともにどんどんずれていきます。Macを起動したまま2日間置いた結果、30,000秒(=500分=8時間20分)以上の差が生じてしまいました。

原因ははっきりとは分かっていませんが、MacIEのキャッシュ機構と関係がありそうです。なぜなら、MacIEのキャッシュをクリアにした後、一旦MacIEを終了させ、もう一度MacIEを起動させてみたところ、30,000秒のずれはなくなっていました。(なお、MacIE5.2.3では、GMT=グリニッジ標準時での時間を返してしまうなどの不具合はありませんでした。)

neweMac_120-90.gif ただ、一定時間で一定の狂いが生じるのかどうかは分かりません。少し観察した結果では違いました。例えば、1時間3,600秒を3,700秒のペースでy=ax的に比例して、誤差が広がっていくなら分かりやすいのですが、そうでもないようです。もしかたら、Macがスリープに入ると、誤差が急拡大するなどのパターンがあるのかもしれません。

また、キャッシュだからといって、数時間前にテストした際にgetTime()関数が返した値をまた返してくるとかいう現象ではなく、本来進んでいるべき時間よりも少ない時間(2日間の計測で約17%の誤差。)しかMacIEでは経過していないということなのです。MacIEだけ時間の流れの速さが違うというか、アインシュタインが喜びそうな現象(浦島太郎効果?)なのかもしれません(物理は全然分かりません。間違っている可能性大です)。

ただし、この現象がTigerでMacIEを使う場合のみ起こる現象なのか、Pantherでも起こるのか、あるいは、私のeMacでのみ起こる現象なのかは今のところ不明です。OS9.2.2のMacIE5.0では、この現象は起きませんでした。少しGoogleで調べてみただけですが、こちらに、MacによってgetTime()の返す値に違いがあることが少し触れられているだけでした。

MacIEでは、今回のことに限らず、キャッシュで悩まされることは多いので、キャッシュ原因説はかなり有望かもしれません。時間があるときに、Pantherなどで調べてみたり、どのような場合に誤差が広がりやすいのか研究してみたいと思います。

<<2005年10月10日午後9時44分追記>>
Panther+MacIE5.2.3(iMac (Graphite) M8492J/A)では、同じIE5.2.3でもこの不具合は発現することはないことが分かりました。やはり、Tigerとの組み合わせで起こるか、私のeMacの問題のようです。Tiger+eMac+MacIE5.2.3では、キャッシュをクリアした直後は正常な数値に戻りましたが、一晩寝かせて(スリープ状態で放置)、再びテストしてみると19,340秒も誤差が生じていました。実に5時間以上の誤差です。ただし、スリープ状態に入ることとgetTime()の誤差の関係は依然として不明です。

|

« ブロードバンド時代にナローバンドに対応する方法(シミュレーション方法) | トップページ | Konquerorで画像の入れ替えJavascriptで不具合が発生するケース »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: MacIE+Tiger: getTime()で時間を正しく取得できない現象(キャッシュの影響が原因?):

« ブロードバンド時代にナローバンドに対応する方法(シミュレーション方法) | トップページ | Konquerorで画像の入れ替えJavascriptで不具合が発生するケース »