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 のマシン上で行いました。

length プロパティのパフォーマンス (単位: ms)
ブラウザ 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の入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
「ハイパーテキストマークアップ言語」をアルファベット4文字でいうと?

コメント:

トラックバック

このエントリのトラックバックURL: http://nanto.asablo.jp/blog/2006/02/21/262269/tb

_ JavaScript++かも日記 - 2006年03月27日 23時31分

length プロパティのパフォーマンス http://nanto.asablo.jp/blog/2006/02/ #もし、getElementsByTagNameでNodeList を作ったら、lengthで回すときは、NodeList.length を使わずに、配列化してからarray.lengthで使った方が早いよ、というベンチマークです。というか、IEでは、NodeList がとんでもなく遅いよ、という話ですね。...

_ すけすけ。 - 2008年12月19日 06時23分

前書いたこれがあまりにも遅いことが判明したので書き直しorz function getElementsByClass(searchClass){ if(document.all){ var allElements=document.all; }else if(document.getElementsByTagName){ var allElements=document.getElementsByTagName("*"); }else