NCZOnline |
"Professional JavaScript for Web Developers"や"Professional Ajax"などの書籍の著者であるNicholas C. Zakas氏がJavaScriptの実装に関する興味深い記事をJavaScript stack overflow errorのタイトルで自身のブログにおいて公開した。Webブラウザごとのスタックオーバーフローエラーが比較検討されている。
Nicholas C. Zakas氏が調査したWebブラウザごとのコールスタックサイズは次のとおり。
- IE7 (1,789)
- Firefox3 (3,000)
- Chrome1 (21,837)
- Opera 9.62 (10,000)
- Safari 3.2 (500)
Webブラウザが出力するスタックオーバーフローエラーと補足される例外の種類は次のとおり。Opera 9.62は例外を発生させずにJavaScriptの動作を停止されるため、例外は補足できないと説明がある。
- IE7 "Stack overflow at line x" (Error)
- Firefox3 "Too much recursion" (InternalError)
- Chrome1 "n/a" (RangeError)
- Opera 9.62 "Abort (control stack overflow)"
- Safari 3.2 "RangeError: Maximum call stack size exceeded." (RangeError)
確認はとれなかったと前置きしたうえで、どうやらIEとOperaは主メモリのサイズに関連してスタックサイズを変更しているようだという記述がある。それ以外のブラウザはあらかじめ定数としてコールスタックサイズが実装されているようだ。寄せられているコメントにもそれを示すようなデータが掲載されている。
JavaScriptにおける大量の再帰処理はパフォーマンスの劣化を招きやすい。またJavaScript stack overflow errorで説明されているように、コールスタックサイズの上限にあたって処理が完了しないケースが考えられる。とくにSafari 3.2のコールスタックサイズは500であり、Safari 3.2で動作するアプリケーションを実装するなら、この数値未満に収まるように実装する必要があることがわかる。Nicholas C. Zakas氏はほかにもJavaScript変数読み書きのパフォーマンス比較と高速化テクニックや全4回Speed up your JavaScriptシリーズなど、JavaScriptに関するティップスの紹介をおこなっている。