Web Application Development - SitePen

Mike Wilcox氏がSitePen Blog » Web Page Global Variable Performanceにおいて、JavaScriptのグローバル変数とローカル変数に関する性能について興味深いベンチマークと考察を公開している。Mike Wilcox氏はフルフィーチャJavaScriptフレームワークDojoの開発者。

Mike Wilcox氏は最近Google Docsに追加されたベクタグラフィックス作成/挿入機能に興味を持ったという。DojoのベクタグラフィックAPIであるdojox.gfxと同じSVGとVMLを使っているためだ。Firebugでその実装を調査したところ、コードほとんどにおいてグローバル変数が使われていることに気がついて驚いたとしている。

JavaScript実装定石のひとつにグローバル変数ではなくローカル変数を使うというものがある。Google Docsの実装でグローバル変数が多用されていることは、この定石に反する。Mike Wilcox氏はそこに興味を引かれたという。氏は定石を確かめるために2万5,000個の乱数をローカル変数とグローバル変数として作成および参照するベンチマークを作成。Firefox 3.5、Firefox 3.0、IE8、IE7、IE6、Chrome 3、Safari 4で実行時間を計測して比較している。

ベンチマーク結果 - Web Page Global Variable Performanceより抜粋

結果からおもに2つの考察が紹介されている。ひとつは、グローバル変数よりもローカル変数の方が処理が高速になるという定石は有効であること。ただし、特定のブラウザ、特にSafariではその限りではなく、ブラウザの実装に依存していること。もうひとつは、グローバル変数でもローカル変数でも、参照よりも作成の方が処理時間がかかることだ。

Mike Wilcox氏の実施したベンチマークでは、Firefox 3.5のグローバル変数の作成がきわだって遅い。IE6をのぞいて、ほかのすべてのブラウザよりも遅くなっている。氏は原因としてFirefoxがXPCOMを使いすぎており、これが貧弱なメモリ管理やコードの肥大化の原因になって、処理速度の低下を招いているのではないかと意見が述べられている。Firefox 4.0ではXPCOMから別の実装を移ろうとしているという記述もある。

Mike Wilcox氏も指摘しているが、興味深いのはGoogleの判断だ。Chromeではほとんど問題にならないが、ベンチマークの結果をみれば最大シェアを占めるIEやFirefoxではグローバル変数ではなくローカル変数の方が処理が高速になる。これに気がついていながら、なぜGoogle Docsではグローバル変数が使われているのか興味深い。