[AS3] ふたつの数値の最大値・最小値を得るにはMathクラスより条件演算子?:の方が速い [Edit]

ふたつの数値のうちの最大値または最小値を求めるには、Math.max()Math.min()メソッドが使われます。けれど、計算の速さが求められる場合には、条件演算子?:を用いて単純に大小比較した方がお得です。

Math.max()およびMath.min()メソッドの演算を条件演算子?:で書替えるには、ふたつの数値の大きさをただ比べるだけです(表001)。演算子?:のごく基本的な使い方でしょう(なお、「条件演算子?:はいつ使うとよいか」参照)。

表001■ふたつの数値のうちの最大値・最小値を求める
Mathクラスのメソッド 条件演算子?:による書替え
Math.max(a, b) (a > b) ? a: b
Math.min(a, b) (a < b) ? a: b

条件演算子に書替えた方が速いのは、大きくふたつ理由があると考えられます。第1は、Math.max()Math.min()メソッドには、いくつでも引数が渡せることです。つまり、引数の数を確かめ、すべての大小を調べることが求められます。そのため、数値はふたつと決めて、それらの大小を比べる?:演算子の処理の方が速くなるのです。

任意の数の引数から最大値を返す関数は、たとえばつぎのスクリプト001のように定められます(不定数の引数定義については、「...(rest)パラメータ定義キーワード」参照)。しかし、この関数の処理は、引数を不定にしてしまったため、Math.max()メソッドと比べて決して速くありません(後掲テスト001参照)。

スクリプト001■任意の数の引数から最大値を取出す関数
function xMax(...values):Number {
	var nLength:uint = values.length;
	var nMax:Number = values[0];
	for (var i:uint = 1; i < nLength; i++) {
		var myValue:Number = values[i];
		if (myValue > nMax) {
			nMax = myValue;
		}
	}
	return nMax;
}

条件演算子を使った方が速い理由の第2は、ステートメントに直接書かれており、関数として定められていないことです。このような書き方を「インライン」といいます。Adobeの「Flash Platformのパフォーマンスの最適化」には、「その他の最適化」の項でつぎのように説明しています。

関数呼び出しは負荷を増加させる可能があります。コードをインライン化して、関数呼び出しの回数を削減するようにします。コードのインライン化は、純粋なパフォーマンスの最適化に適した方法です。ただし、インラインコードではコードの再利用が困難で、SWFファイルのサイズが大きくなる可能性があるので注意してください。

たとえ引数をふたつに決めて演算子?:で比べたとしても、つぎのスクリプト002のように関数として定めればインラインよりは遅くなります(後掲テスト001参照)。

スクリプト002■ふたつのの引数から最大値を取出す関数
function xMax(n0:Number, n1:Number):Number {
	var nMax:Number = (n0 > n1) ? n0 : n1;
	return nMax;
}

ご参考のために以下のテスト001で、Math.max()メソッドと条件演算子を使った最大値の取出しについて、引数不定とふたつにかぎった場合やインラインとの速さを比べてみました。なお、引数不定のときは、4つの数で試しています。

テスト001■Math.max()メソッドと条件演算子?:で最大値の取出しを比べる

Getting the max value with Math.abs() vs custom methods - wonderfl build flash online

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事