新刊ピックアップ

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

この記事を読むのに必要な時間:およそ 1 分

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

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倍の速さまで改善することができます。