ループステートメントの処理速度
2009.9.11 金曜日
ActionScript3ではいくつかのループ処理用のステートメントが用意されていますが、どのステートメントを使用すると処理が速いのか気になり、ちょっと計測してみました。結果は以下のようなグラフになります。短いほど高速処理。
追記・修正 2009.9.23
コメントで指摘して頂いたとおり、ループ処理内で一度変数に代入する(テストスクリプトの5〜7)と高速化します。新たに計測したデータを追加したグラフは上記 *印 の部分。「while」がちょっとだけ速そうだけど、誤差の範囲かな。
package {
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.geom.Point;
import flash.utils.getTimer;
public class Main extends MovieClip {
public function Main():void {
//リスナー登録
stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDown);
}
//キーが押された場合
private function KeyDown(e:KeyboardEvent):void {
//計測時間を出力
trace(Check(e.keyCode));
}
//時間を計測
private function Check(_key:uint):uint {
//変数宣言
var test:uint;
//開始時間
var time:uint = getTimer();
//リストの作成、初期化
var list:Array = new Array();
var l:uint = 1000000;
for (var i:uint = 0; i < l; i ++) {
list[i] = new Point(i, i);
}
//1
if (_key == 49) {
for each(var a in list) {
test = a.x + a.y;
}
}
//2
else if (_key == 50) {
for (var b in list) {
test = list[b].x + list[b].y;
}
}
//3
else if (_key == 51) {
for (var c:uint = 0; c < l; c ++) {
test = list1.x + list1.y;
}
}
//4
else if (_key == 52) {
var d:uint = 0;
while (d < l) {
test = list[d].x + list[d].y;
d ++;
}
}
//5
else if (_key == 53) {
var f:Point;
for (var e in list) {
f = list[e];
test = f.x + f.y;
}
}
//6
else if (_key == 54) {
var h:Point;
for (var g:uint = 0; g < l; g ++) {
h = list[g];
test = h.x + h.y;
}
}
//7
else if (_key == 55) {
var j:uint = 0;
var k:Point;
while (j < l) {
k = list[j];
test = k.x + k.y;
j ++;
}
}
return(getTimer() - time);
}
}
}
Posted by tmdf|ActionScript
trackback
http://tmdf.net/blog/20090911_as3_loop.html/trackbackcomments(1)
通りすがり|2009.9.12 土曜日
for each … in 意外では内部で二回ハッシュアクセスしているからだと思いますよ。
for (var b in list) {
var n = list[b];
test = n.x + n.y;
}
みたいな感じで変数用意してハッシュアクセスする回数を減らすと高速になりませんでしょうか?