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!