Mozilla Foundation, JavaScript EvangelistにしてjQueryの開発者であるJohn Resig氏は12日(米国時間)、 Accuracy of JavaScript Timeにおいて興味深い計測結果を報告している。報告によればJavaScript Webアプリケーションの性能計測をWindows XPやVistaで実行している場合、それはあまり正確な値とはいえないかもしれない。Webデベロッパは報告されている内容を一度検討しておきたい。
John Resig氏は自身が開発しているjQueryの性能を改善するためにベンチマークを実行するわけだが、Dromaeoで結果に0msが含まれていたりSlickSpeedの結果が揺れすぎることに疑問を感じていたという。正確に計測できているならこうした結果にはならず揺れはあるにしても再現性があるはずだし、0msが頻繁に出てくるというのもちょっとおかしい。
ベンチマークでは大体試験の最初と最後の段階で(new Date).getTime()のようにして現在時刻をミリ秒で取得し、その差分で実行時間を計測している。計測結果には正規分布に則った揺れが伴う。この結果を加味してベンチマークでは結果を出力している。ちなみにSunSpiderやDromaeoではより優れた結果を得るためにスチューデントのt分布を使っている(標本が十分でなかったり母分散が未知の場合にはt分布の方が優れた結果を得やすい)。
John Resig氏は揺れが発生したり0msが検出される原因を明らかにする目的で、空ループを1万回繰り返したり数千のdivを経由してループやクエリ、編集を実施するベンチマークを作成しヒストグラムにまとめた。Mac OS Xで計測したところ0msの近辺に結果が集まるという結果が得られるものの、それ以外はOpera、Safari、WebKit Nightly、Firefoxで期待通りの正規分布が観測されている。
これをWindows XPで実行するとFirefoxとChromeが辛うじて正規分布のような結果を示すものの曖昧な形になり、それ以外のブラウザは正規分布っぽさすらなく定期的に値が現れている。ネイティブに実行してもVMware Fusionで実行しても結果は同じだとされている。Vistaでもたいした違いはないようだ。getTime()の返す値の粒度が15msであるため、その値まで精度が下がるのが原因だ。結果的に実行時間が15ms以下の場合は0msとして現れることになる。この15ms制限をクリアするには少なくとも試験が750ms以上かかるようにして全体の1%未満にまでしないと効果的な結果が得られない。
John Resig氏の指摘によれば、こうした問題を加味してベンチマークが実施されているのはGoogleが公開しているV8 Benchmark Suiteになるようだ。もしこれまで自身で1秒に満たないベンチマーク試験を作成してJavaScriptのコードやJavaScriptフレームワークの評価をWindows XPやVistaで実施していたのであれば、それぞれのベンチマークが1秒はかかるようにして再度チェックした方がいいかもしれない。