javascriptのforを高速化する

おしえてもらったネタだがメモっておく。
javascriptのfor文を高速化する

配列の要素をインクリメントする際にこっちより、

for (var i in array) {
    array[i]++;
}

以下の方が速いとのこと。

var i; if (array && (i = array.length)) for (; i--; ) {
    array[i]++;
}

実際にJavascriptShellで計測してみた。

$ time js -e 'a=[];for(i=1;i<1000000;++i){a.push(i);};for(var i in a){a[i]++;};for(var i in a){a[i]++;};for(var i in a){a[i]++;};for(var i in a){a[i]++;};for(var i in a){a[i]++;};for(var i in a){a[i]++;};for(var i in a){a[i]++;};for(var i in a){a[i]++;};for(var i in a){a[i]++;};for(var i in a){a[i]++;};'                                                       
real    0m45.361s
user    0m44.530s
sys     0m0.690s

$ time js -e 'a=[];for(i=1;i<1000000;++i){a.push(i);};for(var i=a.length; i--;){a[i]++;};for(var i=a.length; i--;){a[i]++;};for(var i=a.length; i--;){a[i]++;};for(var i=a.length; i--;){a[i]++;};for(var i=a.length; i--;){a[i]++;};for(var i=a.length; i--;){a[i]++;};for(var i=a.length; i--;){a[i]++;};for(var i=a.length; i--;){a[i]++;};for(var i=a.length; i--;){a[i]++;};for(var i=a.length; i--;){a[i]++;};'

real    0m13.554s
user    0m13.400s
sys     0m0.160s

こんなに差がある。まあそんな巨大な配列普通はつかわないな(笑

ブラウザで実際に計測

ベンチマークツール公開 - IT戦記を利用させて頂いた

<html>
<head>
<script src="http://sample.ecmascript.jp/benchmark.js"></script>
<script>
a=[];
for(i=1;i<1000;++i){a.push(i)}
benchmark({
 'slow': function() {
  for(var i in a){a[i]++;};
  for(var i in a){a[i]++;};
  for(var i in a){a[i]++;};
  for(var i in a){a[i]++;};
  for(var i in a){a[i]++;};
 },
 'fast': function() {
  for(var i=a.length; i--;){a[i]++;};
  for(var i=a.length; i--;){a[i]++;};
  for(var i=a.length; i--;){a[i]++;};
  for(var i=a.length; i--;){a[i]++;};
  for(var i=a.length; i--;){a[i]++;};
 }
});
</script>
</head>
<body>
</body>
</html>

結果 firefox

preparing ...
let's go!
.
*** slow ***
result : 10.99233[ms]
.
*** fast ***
result : 2.0234639999999997[ms]
.
finish!

結果 IE

preparing ...
let's go!
.
*** slow ***
result : 8.114754[ms]
.
*** fast ***
result : 4.214754[ms]
.
finish!