ary.push(xxx)とary[ary.length]=xxx ; 配列へ要素を追加する方法

こちらで紹介されているコードなんですが、配列に要素を追加するために以下のように書いているんですね(chars配列にcを追加)。

chars[chars.length] = c;

なるほどなあと感心すると同時に、普通なら chars.push(c) と書くんじゃないかなぁ?というのがJavaScript初心者から初級者へなりつつある僕の感想。なんでpush使わないんだろ?NN4の頃からあるメソッドだというから互換性の問題じゃないよなあ。
というわけで、両方のコードをベンチマークしてみました。
まず、pushを使うコード(ブックマークレット)。

javascript:t = new Date().getTime();for(i = 0, a = []; i < 1000000; ++i){a.push(i);}new Date().getTime()-t;

単位はms。

Firefox2 8187 8438 8312
IE6 4578 4532 4473

次に、lengthを使うコード。

javascript:t = new Date().getTime();for(i = 0, a = []; i < 1000000; ++i){a[a.length] = i;}new Date().getTime()-t;
Firefox2 8438 8578 8704
IE6 3422 3328 3375

結果ですが、

  • Firefox2だと、微妙にlength側の方が遅い可能性がある(t検定の結果はp=0.07)。
  • IE6だと、有意にlength側の方が早い(p=0.0007)。

となりました。
Firefox2でlengthの方が遅いのは、ごくわずかなものですし、統計的にもあんまり信用できない(サンプル増やせば良いんですけど面倒)なものなので、一般にはpushを使うよりlengthを使った方が良好なパフォーマンスが出せそうです。
Fx3ではどうなんだろ。