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

色付きが 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);
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 を多用している。おそらく、有意義な差が出るほどの繰り返しを想定していなくて、すっきりとしたコーディングの方が重要という評価なのかな。
この記事へのコメント