ActionScript 3.0 最速チューニングのための第一歩

データ型を定めるという基本原則

ActionScript 3.0には、必ず変数や関数の型指定をしましょうという、原則とも言えるセオリーがあります。しかし、やらなくても文法上は問題なく動くことから、初心者は無視しがちです。

このセオリーに従うと、扱いが速くなるだけでなく、スクリプトが見やすくなり、また間違えればエラーを示してくれます。チューニングの最初の一歩とも言えるこのトピックを、変数のケースで解説します。

まずは、変数の型指定のしかたを確認します。次のように書きます。

var 変数:データ型;
変数 = 値;

次のような1行のステートメントで済ませることも可能です。

var 変数:データ型 = 値;

繰り返し処理で実践的に使用する

では、実践的に使用してみましょう。配列(my_array)からすべてのエレメントを取り出すような、forループでの繰り返し処理を考えてみます。

回数をカウントアップ/ダウンするために、繰り返し処理ではよくカウンタ変数が使われます。ループを何回繰り返すかという変数ですから、小数やマイナスの値を取らないことはわかっています。しかし次のスクリプトでは、型指定していません。

スクリプト
// 処理1
for(var i = 0; i < my_array.length; i ++) {
    var element:Object = my_array[i];
}

次のスクリプトでは、カウンタ変数(i)をuint型に指定しました。

スクリプト
// 処理2
for(var i:uint = 0; i < my_array.length; i ++) {
    var element:Object = my_array[i];
}

uint型なので、0以上の整数であることが明確に宣言され、理論上はよりよいスクリプトです。しかし、実際パフォーマンスはどの程度変わるのでしょうか。

実際にパフォーマンスを計測する

さっそく次のようなスクリプトで、処理1と処理2にかかる時間を計測してみます。

※参考:http://www.nekonomics.jp/2012/02/actionscript30.html
スクリプト
// 初期化
var my_array:Array = new Array(100000);
// 経過時間t1を記録
var t1:int = getTimer();
// 処理1
for(var i = 0; i < my_array.length; i ++) {
    var element:Object = my_array[i];
}
// 経過時間t2を記録
var t2:int = getTimer();

trace("処理1の処理時間: " + (t2-t1) + " msec");
スクリプト
// 初期化
var my_array:Array = new Array(100000);
// 経過時間t1を記録
var t1:int = getTimer();
// 処理2
for(var i:uint = 0; i < my_array.length; i ++) {
    var element:Object = my_array[i];
}
// 経過時間t2を記録
var t2:int = getTimer();

trace("処理2の処理時間: " + (t2-t1) + " msec");

環境により処理の時間は変わりますが、筆者の場合、次のような結果になりました。

処理1の処理時間: 13 msec  
処理2の処理時間: 10 msec

わずかな違いとはいえ、初歩的なセオリーを守るだけで約1.3倍速くなりました。

なお、処理2には最適化の余地があり、約2倍の速さまで改善することができます。