しつこく JavaScript の for文
ウンザリしてる人多数だと思いますが、しつこく行きますヨ(笑)。

まず、配列の length はプロパティだということ。ただし、length は DontEnum という特別なプロパティで、for in では走査されない。
var ar = [1, 2, 3];
for (var i in ar){
log(ar[i]); // 1, 2, 3
}

だからといって、配列を走査するのに for in を使うべきではない。配列のプロトタイプを拡張した時(例えば以下のような場合)に対応できなくなる。
var ar = [1, 2, 3];
Array.prototype.foo = "hoge";
for (var i in ar){
log(ar[i]); // 1, 2, 3, hoge
}
配列の走査には、素直に for を使う。


それから、普通の配列であれば、for文の lengthプロパティの参照回数を気にする必要は無いけれど、配列が NodeList の場合は、lengthプロパティの参照回数はパフォーマンスへの影響が大きい。

 例えば、以下のような HTML を考えてみる。
<ul id="list">
<li>foo<li>
<li>hoge<li>
<!-- 20個ぐらい続く -->
<ul>

これに対して、以下のような関数を実行して、ベンチを取ってみる。
benchmark({  
test_a: function(){
// doc は document に読み替えてください
var e = doc.getElementById("list");  
var cn = e.childNodes;
for (var i = 0; i < cn.length; i++) {
for (var j = 0; j < cn.length; j++){
}
}
},

test_b: function(){
// doc は document に読み替えてください
var e = doc.getElementById("list");
var cn = e.childNodes;
for (var i = 0, l = cn.length; i < l; i++) {
for (var j = 0; j < cn.length; j++){
}
}
}
});

とりあえず、手元の Mac での結果だけ。
FireFox2
*** test_a ***
result : 25.689415[ms]
.
*** test_b ***
result : 0.9103554[ms]

Safari
*** test_a ***
result : 3.423012[ms]
.
*** test_b ***
result : 3.403012[ms]

って、FireFox は確かに差が出たけど、Safari ではほとんど差が出ないんですけど・・・w。何だこのブラウザw。


参考:
IT戦記 - JavaScript の配列と連想配列の違い
天野 仁史 「パフォーマンス改善の定石」: WEB+DB PRESS Vol.35 p73
[PR]
by fkmn | 2007-03-04 23:00 | IT
<< バイオインフォマティクス技術者... 実践『JavaからRubyへ以... >>


とあるWebアプリケーションエンジニアの日記
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
プログラミングが「出来る..
from とりあえず9JP?
Genographic ..
from ナンジャモンジャ
ジュセリーノ
from ありの出来事
くちこみブログ集(ライフ..
from くちこみブログ集(ライフ)(..
以降、丁寧語で行こう!
from エッセイ的な何か
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX