length プロパティのパフォーマンス ― 2006年02月21日 03時01分
「for 文 2.0」(IT戦記) では length プロパティの評価をループの外に出すことにより高速化を図っています。DOM の NodeList オブジェクト (document.getElementsByTagName()
などで取得) や HTMLCollection オブジェクト (document.forms
などで取得) の length プロパティは「生きている」(オブジェクト取得後の操作が反映される) 、すなわち誤解を恐れずいえば評価のたびに数えなおす必要があるので遅いというのも納得ですが、JavaScript のネイティブオブジェクトである配列の length プロパティはどうなのでしょうか。実際に調べてみました。
以下は 10000 個の span 要素に対する NodeList オブジェクトと配列の length プロパティのパフォーマンスを調べた結果です。数値は 5 回テストした平均値で単位はミリ秒、「先に取得」というのは「for 文 2.0」で紹介されていたように length プロパティの評価を 1 回だけにした場合です。テストはいずれも Pentium M 1.3 GHz 、メモリ 256 MB 、Windows XP のマシン上で行いました。
ブラウザ | NodeList | 配列 | 先に取得 |
---|---|---|---|
Firefox 1.0.7 | 144 | 14 | 2 |
Firefox 1.5.0.1 | 144 | 12 | 4 |
IE 6.01 SP2 | 11062 | 14 | 2 |
Opera 7.54u2 | 54911 | 28 | 18 |
Opera 8.51 | 26 | 12 | 4 |
Opera 9 TP2 | 22 | 12 | 6 |
結果を見ればわかるとおり、NodeList と配列では length プロパティの評価に大きなパフォーマンスの差があります。length プロパティの評価を 1 回だけにするというのは NodeList に対しては有効ですが、配列に対してはよほど性能が求められる場合を除けば大きな意味はないのではというのが個人的な見解です。
それにしても Opera 7 は NodeList の length プロパティの評価が非常に遅いのですが Opera 8 以降では非常に速くなっています。何か特殊な最適化でも施してあるのでしょうか。
コメント
トラックバック
このエントリのトラックバックURL: http://nanto.asablo.jp/blog/2006/02/21/262269/tb
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。