Math.round()を使わずに値を丸める

最適化のために、Math.round()を使わない計算式を覚書。
ちなみに、Math.round()でも引数に計算式を渡すより計算した値を渡すほうが少しだけ速かった。

試した中で速かったのはこれ。
ただし、戻り値がint型になる。
/**
 * 値をまるめる
 * 
 * @param	value - 値
 * @return	丸めた値
 */
function round(value:Number):int
{
	return int(WIDTH + .5);
}


一応比較結果とソース。

This site requires flash player 9 or later.

Get Adobe Flash player
/**
 * Math.round()の実行速度テスト
 *
 */

const WIDTH:Number = 99.49;     //四捨五入に使う値
const NUM_LOOP:int = 1000000;   //繰り返し回数

var startTime:Number;
var i:int;
var value:Number;


//実行速度テスト

startTime = getTimer();
for(i = 0; i < NUM_LOOP; i++) {
	//floor1(WIDTH / 2);
	value = WIDTH / 2;
	Math.round(value);
}

//計算時間を出力
var result1:TextField = new TextField();
result1.text = "Math.round(変数) ---> " + (getTimer() - startTime) + "ms";
result1.autoSize = TextFieldAutoSize.LEFT;
addChild(result1);


startTime = getTimer();
for(i = 0; i < NUM_LOOP; i++) {
	Math.round(WIDTH / 2);
}

//計算時間を出力
var result2:TextField = new TextField();
result2.text = "Math.round(計算式) ---> " + (getTimer() - startTime) + "ms";
result2.y = 25;
result2.autoSize = TextFieldAutoSize.LEFT;
addChild(result2);


startTime = getTimer();
for(i = 0; i < NUM_LOOP; i++) {
	var rest:Number = value % 1;
	var result:Number = (rest < .5) ? value - rest : value + (1 - rest);
}

//計算時間を出力
var result3:TextField = new TextField();
result3.text = "(rest < .5) ? value - rest : value + (1 - rest) ---> " + (getTimer() - startTime) + "ms";
result3.y = 50;
result3.autoSize = TextFieldAutoSize.LEFT;
addChild(result3);


startTime = getTimer();
for(i = 0; i < NUM_LOOP; i++) {
	var hoge:int = int(WIDTH + .5);
}

//計算時間を出力
var result4:TextField = new TextField();
result4.text = "int(WIDTH + .5) ---> " + (getTimer() - startTime) + "ms";
result4.y = 75;
result4.autoSize = TextFieldAutoSize.LEFT;
addChild(result4);