Getting the max value with Math.max() vs custom methods

by Fumio
Math.max() method is slow because of its ability to handle multiple arguments.  With two values using the conditional operator (?:) is the fastest especially inline.
♥3 | Line 144 | Modified 2011-05-20 20:01:32 | MIT License
play

ActionScript3 source code

/**
 * Copyright Fumio ( http://wonderfl.net/user/Fumio )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/2y4I
 */

package {
	import flash.display.Sprite;
	import flash.utils.getTimer;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
	import flash.text.TextFormatAlign;
	[SWF(width = "240",height = "180")]
	public class GettingMaxValue extends Sprite {
		private const AMOUNT:uint = 1000000;
		private const ARGUMENTS:uint = 4;
		private var myVector:Vector.<Number> = new Vector.<Number>(AMOUNT);
		private var my_txt:TextField = new TextField();
		private var label_txt:TextField = new TextField();
		private var my_fmt:TextFormat = new TextFormat();
		public function GettingMaxValue() {
			// Creating a TextField for display
			createTextField();
			createNumbers();
			// Starting Test
			testMathMultiple();
			testMethodMultiple();
			testMethodMultiple2();
			testMathTwo();
			testConditional();
			testMethodTwo();
		}
		private function testConditional():void {
			var _vector:Vector.<Number>  = myVector;
			var nAmount:uint = _vector.length - 1;
			var started:int = getTimer();
			for (var i:uint = 0; i < nAmount; i++) {
				var n0:Number = _vector[i];
				var n1:Number = _vector[uint(i + 1)];
				var nMax:Number = (n0 > n1) ? n0: n1;
			}
			xTrace("(n0 > n1) ? n0: n1", getTimer() - started);
		}
		private function testMathMultiple():void {
			var _vector:Vector.<Number>  = myVector;
			var nAmount:uint = _vector.length - ARGUMENTS + 1;
			var started:int = getTimer();
			for (var i:uint = 0; i < nAmount; i++) {
				var n0:Number = _vector[i];
				var n1:Number = _vector[uint(i + 1)];
				var n2:Number = _vector[uint(i + 2)];
				var n3:Number = _vector[uint(i + 3)];
				var nMax:Number = Math.max(n0, n1, n2, n3);
			}
			xTrace("Math.max(<4 arguments>)", getTimer() - started);
		}
		private function testMathTwo():void {
			var _vector:Vector.<Number>  = myVector;
			var nAmount:uint = _vector.length - 1;
			var started:int = getTimer();
			for (var i:uint = 0; i < nAmount; i++) {
				var n0:Number = _vector[i];
				var n1:Number = _vector[uint(i + 1)];
				var nMax:Number = Math.max(n0, n1);
			}
			xTrace("Math.max(<2 arguments>)", getTimer() - started);
		}
		private function testMethodMultiple():void {
			var _vector:Vector.<Number>  = myVector;
			var nAmount:uint = _vector.length - ARGUMENTS + 1;
			var started:int = getTimer();
			for (var i:uint = 0; i < nAmount; i++) {
				var n0:Number = _vector[i];
				var n1:Number = _vector[uint(i + 1)];
				var n2:Number = _vector[uint(i + 2)];
				var n3:Number = _vector[uint(i + 3)];
				var nMax:Number = max(n0, n1, n2, n3);
			}
			xTrace("Method max(<4 arguments>)", getTimer() - started);
		}
		private function testMethodMultiple2():void {
			var _vector:Vector.<Number>  = myVector;
			var nAmount:uint = _vector.length - ARGUMENTS + 1;
			var started:int = getTimer();
			for (var i:uint = 0; i < nAmount; i++) {
				var n0:Number = _vector[i];
				var n1:Number = _vector[uint(i + 1)];
				var n2:Number = _vector[uint(i + 2)];
				var n3:Number = _vector[uint(i + 3)];
				var nMax:Number = max2(n0, n1, n2, n3);
			}
			xTrace("Method max(<4 args> /w if)", getTimer() - started);
		}
		private function testMethodTwo():void {
			var _vector:Vector.<Number>  = myVector;
			var nAmount:uint = _vector.length - 1;
			var started:int = getTimer();
			for (var i:uint = 0; i < nAmount; i++) {
				var n0:Number = _vector[i];
				var n1:Number = _vector[uint(i + 1)];
				var nMax:Number = max3(n0, n1);
			}
			xTrace("Method (/w ?:)", getTimer() - started);
		}
		private static function max(...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]
				nMax = (myValue > nMax) ? myValue : nMax;
			}
			return nMax;
		}
		private static function max2(...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;
		}
		private static function max3(n0:Number, n1:Number):Number {
			var nMax:Number = (n0 > n1) ? n0: n1;
			return nMax;
		}
		private function createNumbers():void {
			var nAmount:uint = AMOUNT;
			var nRange:Number = 10;
			var nMin:Number = -5;
			for (var i:uint = 0; i < nAmount; i++) {
				myVector[i] = Math.random() * nRange + nMin;
			}
		}
		private function createTextField():void {
			addChild(my_txt);
			addChild(label_txt);
			my_fmt.align = TextFormatAlign.RIGHT;
			my_txt.x +=  70;
			my_txt.defaultTextFormat = my_fmt;
			my_txt.autoSize = TextFieldAutoSize.RIGHT;
			label_txt.autoSize = TextFieldAutoSize.LEFT;
		}
		private function xTrace(_str:String, n:int):void {
			my_txt.appendText(String(n) + "\n");
			label_txt.appendText(_str + ":" + "\n");
		}
	}
}

Forked