2010年04月12日

javascript:遅い push も使い方次第?

Array.prototype.push が遅いのは割と知られていると思う。なので何も考えずにひたすら length を使ってましたが・・・、使い方として push の方が有利な場合について。



その前に push の遅さを再調査。

push と length

色付きが push を使った場合で 10000000回を基準としています。ie7 と ff2 はそこまでできないので 1000000回行った結果を 10倍していますので仮想値になります。また各結果は 3回試行した平均値で msec と length との比です。環境は・・・、面倒なので割愛。ヘボヘボですw

やたら ff2 が遅い事と push の方が速いのは意外ですが、ff2 を除けば最大 1.6 倍程度 push の方が遅い。

そこで短絡的に考えるのは、push は可変長の与え値を許容すると言う事です。仕様的には arguments 取ってきて、その長さに応じてなんてやってる。つまり、複数個同時に入れる場合においては push の方が速いのでは?って事です。

r = [];
var t = (new Date()).getTime();
for(var i = 100000; i--; ){
  r.push(0, 1, 2, 3);
}
t = (new Date()).getTime() - t;
alert(t);

r = [];
var t = (new Date()).getTime();
for(var i = 100000; i--; ){
  r[r.length] = 0;
  r[r.length] = 1;
  r[r.length] = 2;
  r[r.length] = 3;
}
t = (new Date()).getTime() - t;
alert(t);

とまあ、簡単に比べてみると ff3 では2つ目から逆転しますし、ie では 4つ目から逆転します。表は・・・。面倒になったので言葉だけ。興味あったら試してみてください。

実際、繰り返しの中で複数個を入れる事ってなかなか無いと思いますが(以前そういう事が必要になった時に。ふと・・・)もし、そういう場面があるなら、push の方がパフォーマンスがあがる。とは言え prototype.js にしろ何にしろ length ではなく push を多用している。おそらく、有意義な差が出るほどの繰り返しを想定していなくて、すっきりとしたコーディングの方が重要という評価なのかな。



posted by HiFa at 15:23 | 🌁 | Comment(0) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする
>>> スパムコメントは消してますよん。 お互い無駄な労力は避けましょう。 <<<

この記事へのコメント

コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック