NCZOnline |
"Professional JavaScript for Web Developers"、"Professional Ajax"などの書籍の著者でありSpeed up your JavaScriptシリーズを公開したNicholas C. Zakas氏が再び興味深い記事をブログで公開した。JavaScript variable performanceだ。WeブラウザごとにJavaScriptにおける変数へのアクセスの時間を計測してまとめている。
JavaScriptパフォーマンスの高速化手法に『外部変数を使うのではなく可能な限りローカル変数を使う』というテクニックがある。これは識別子の検索がローカル変数から実施されるためで、外部変数を使うよりもローカル変数を使う方が検索が短い時間で終わるため結果的に処理時間の短縮につながるというものだ。1度以上外部変数を使うなら、ローカル変数に代入して使った方がいいとされている。
JavaScript variable performanceでは実際にどの程度違いがあらわれるのかを計測するため、ローカル変数から外部変数(深さは2-6)までブラウザごとに処理時間をまとめている。使われたブラウザと結果は次のとおり。
- Webkit Nightly (528+), Google Chrome 1 - 高速でフラットなアクセス性能を実現。Google Chrome 1の方は外部変数のアクセスはローカル変数に比べると遅い
- Opera 9.62 - Webkit/Chromeに比べると遅いがフラットなアクセス性能を実現
- Firefox 3 - 深くなるにつれて遅くなる傾向
- Firefox 3.1 Beta 2 - 深くなるにつれて遅くなる傾向。ローカル変数のアクセスは高速だがそれを超えるととたんに遅くなる
- Safari 3.1 (525.13) - 深くなるにつれて遅くなる傾向
- Safari 3.2 (525.27.1) - 深くなるにつれて遅くなる傾向
- IE8 Beta 2 - 深くなるにつれて遅くなる傾向
- IE7 - 深くなるにつれて遅くなる傾向
Google ChromeとWebkit Nightlyはフラットで高速な結果を出している。これは開発が進められているV8およびSquirrelFish JavaScriptエンジンの効果とみられる。Firefoxはそれほど性能がでていないが、これはTraceMonkeyが有効にされていないためで、TraceMonkeyを有効にした場合にはChromeやWebkit Nightlyと似たような結果を示すのではないかとみられる。Operaは次世代JavaScriptエンジンが有効になっていないにもかかわらずフラットで良好な結果を出している。次世代エンジンが有効になればさらに高速化が期待できそうだ。JavaScript variable performanceにはグラフ付きで結果がまとまっている。
すでに登場している、またはこれから登場が計画されている最新のWebブラウザでは外部変数へのアクセスも高速化されることになりそうだが、最大シェアを誇るIE7やIE8でほとんど改善がみられないことから『外部変数を使うのではなく可能な限りローカル変数を使う』テクニックは引き続き有効な高速化手法ということになりそうだ。