配列を for で回すときは length を何度も参照すると遅い

JavaScripter な人たちには大分前から周知のことだけど
以下のスクリプトでどのくらい違うのかちょっと見てみた。

var bench = function(func) {
  var start = (new Date()).getTime();
  func();
  var end   = (new Date()).getTime();
  console.log(end - start);
};

var ary = new Array(1000000);
bench(function() {
  for (var i = 0; i < ary.length; i++) {
    ;
  }
});
bench(function() {
  for (var i = 0, l = ary.length; i < l; i++) {
    ;
  }
});


Firefox3 Firebug1.2.0b4 の上で実行すると

350
95

とか出る。


この速度差は、JS のドット演算子がハッシュテーブルの検索処理を伴うことが原因で生まれる。
上の for みたいに length を何度も参照するときは一時変数を用意してそちらを参照した方が速い。


また、ローカルの SpiderMonkey で console.log を print にして試したら

1367
501

とか出た。


どちらにせよ length を一回だけ参照する方が速いのは変わらないんだけど
Firefox3 の JS の方が SpiderMonkey のよりもかなり速いのにちょっと驚いた。
けっこう違うんだなぁ。