配列を 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 のよりもかなり速いのにちょっと驚いた。
けっこう違うんだなぁ。