Tom Trenka氏は以前SitePenにおいてString Performance: an Analysisというタイトルのもとで興味深いドキュメントを公開した。同ドキュメントはdojox.string.Builderのパフォーマンスを改善することを目的として行われた分析の結果をまとめたもので、JavaScriptプログラミングには欠かせない興味深い結論が導き出されていた。
これまでのテクニックに従えば、文字列は一旦配列に分解してから操作をおこない、最後に文字列に戻した方が処理が高速になると考えられてきた。以前のIEであればその貧弱な文字列処理性能やGCの動作の影響でそれは事実だったが、最近のWebブラウザでは改善されており配列に分解するよりも"+="で連結した方が処理が高速になることが明らかになった。これがString Performance: an Analysisでの主な結論だ。
しかし同分析ではほかのブラウザと比較してIEのパフォーマンスがあまり芳しいものではなかった。Tom Trenka氏は今度はIEにおけるパフォーマンスを向上させることを目的として分析をおこない、その結果をString Performance: Getting Good Performance from Internet Explorerとして公開した。こちらも実に興味深い内容になっている。
まずIEにおいても"+="の処理が高速であり、IE6では配列を使った場合よりも若干劣る程度、IE7では"+="を使った方が処理が高速になることを説明している。IE6/7でも"+="が有効というわけだ。興味深いのはここからだ。同氏は実験を通じて、dojox.string.Builderで実装されているappendメソッドを、引数ひとつで実行する場合よりも、複数渡して実行したときの方がパフォーマンスが向上していることを発見した。同氏が分析するところでは、これはIEの文字列オブジェクトの処理に理由があるようだ。
IEでは大規模文字列の処理がパフォーマンス上の問題となっている。同実装では複数の引数を与えた場合には空の文字列バッファを用意してから、そのバッファに一旦文字列を追加していき、最後に目的のバッファに追加するという方法を採用している。しかし引数がひとつしかない場合には引数を直接バッファに追加している。この処理の差が実行速度の差として現れたという。
こうした結果を踏まえ同氏は (1)IEでもIE6以上であれば"+="を使うこと、(2)ただし処理する文字列が64KBを越える場合には配列を使うこと、(3)大きなサイズの文字列の処理はなるたけ避けできるだけ小さい文字列操作を先に実行するように工夫すること、などをテクニックとして紹介している。ちなみにこのテクニックはOperaやSafariに対しても効果があったとしているが、Firefoxに対しては効果がなかったことも明記されている。GCやJScriptエンジンへの言及もあり、IEで性能を発揮できるJavaScriptコーディングに役立つ情報だ。JavaScriptプログラマは一度String Performance: Getting Good Performance from Internet Explorerに目を通しておくとよさそうだ。