2011年4月9日土曜日

Arrayのイテレーション

Arrayの中身を1つ1つ見ながら何か処理をする事がよくある。ActionScriptでは、その実装方法としていくつかのやり方が提供されている。以前から、どの方法が速いのか気になっていたので、それを調べてみた。

大きく4つの方法が考えられる。

方法1:最も古典的(?)な方法

    for (var i:int = 0;i < arr.length;i++)


方法2:arr.lengthをfor文の外に出した方法。

    var length:int = arr.length;
    for (var i:int = 0;i < arr.length;i++)


方法3:for each文を使った方法

    for each(var i:int in arr)


方法4:Array.forEachを使った方法

    arr.forEach(...);


それぞれの処理スピードを比較してみた。方法1が一番遅いので、それと比較してどの程度速いかを以下に示す。



方法2:18%速い
方法3:15%速い
方法4:33%速い


考察
ActionScriptでは、Array.lengthプロパティが遅い事はよく知られている。なので、これをfor文の中で利用するとループが極端に遅くなる。これが、方法1が遅い理由だ。なぜ、Array.lengthが遅いのかはわからない。方法2が存在する理由もここにある。方法3は方法2より速いと思われたが、結果は予想に反していた。方法3の方が、可読性に優れている気もするが、スピードを気にするなら方法2や方法4を選んだ方がいいようだ。方法4は予想通り最も速かった。

イテレーションをする場合、単にスピードだけでなく、その中で何をするかによっても、選ばれる方法は変わってくる。今後はこれを参考に方法を選びたいと思う。

0 件のコメント: