Type Checking

From ActionScript Performance Wiki

Jump to: navigation, search

Contents

Purpose

See the fastest way to find out an objects type. This also includes a variant where each object has a value name.

Code

package  
{
	import flash.display.Sprite;
 
	public class Test extends Sprite 
	{
		public var testSprite1:Sprite = new TestSprite1(),
					testSprite2:Sprite = new TestSprite2(),
					testSprite3:Sprite = new TestSprite3(),
					testSprite4:Sprite = new TestSprite4();
		public var current:Sprite;
		public var i:Number;
 
		public function Test()
		{
			current = testSprite4;
			trace(new PerformanceComparison(1000000, test1, test2, test3, test4).start());
		}
 
		protected function test1():void 
		{
			if (current.name == "sprite1") 
			{
				i = 1;
			}
			else if (current.name == "sprite2") 
			{
				i = 2;
			}
			else if (current.name == "sprite3") 
			{
				i = 3;
			}
			else if (current.name == "sprite4")
			{
				i = 4;  
			}
		}
 
		protected function test2():void 
		{
			switch (current.name) 
			{ 
				case "sprite1" :					
					{
					i = 1;
					break;
					}
				case "sprite2" :
					{
					i = 2;
					break; 
					}
				case "sprite3" :
					{
					i = 3;
					break; 
					}
				case "sprite4" :
					{
					i = 4;
					break; 
					}
			}
		}
 
		protected function test3():void 
		{
			if (current is TestSprite1) 
			{
				i = 1;
			}
			else if (current is TestSprite2) 
			{
				i = 2;
			}
			else if (current is TestSprite3) 
			{
				i = 3;
			}
			else if (current is TestSprite4) 
			{
				i = 4;
			}
		}
 
		protected function test4():void 
		{
			switch (true) 
			{ 
				case (current is TestSprite1) :					
					{
					i = 1;
					break;
					}
				case (current is TestSprite2) :
					{
					i = 2;
					break; 
					}
				case (current is TestSprite3) :
					{
					i = 3;
					break; 
					}
				case (current is TestSprite4) :
					{
					i = 4;
					break; 
					}
			}
		}
	}
}
 
import flash.display.Sprite;
 
internal class TestSprite1 extends Sprite
{
	public function TestSprite1()
	{
		name = "sprite1";
	}
}
 
internal class TestSprite2 extends Sprite
{
	public function TestSprite2()
	{
		name = "sprite2";
	}
}
 
internal class TestSprite3 extends Sprite
{
	public function TestSprite3()
	{
		name = "sprite3";
	}
}
 
internal class TestSprite4 extends Sprite
{
	public function TestSprite4()
	{
		name = "sprite4";
	}
}

Results

Compiler version: 3.3.0.485, Player version: MAC 10.0.2.54, Operating System: Mac OS 10.5.8

Test 1
1389 ms, 73% slower
Test 2
1036 ms, 29% slower
Test 3
804 ms, best
Test 4
946 ms, 18% slower

Compiler version: 3.3.04852, Player version: WIN 10.0.45.2, Operating System: Windows XP

Test 1
1020 ms, 56% slower
Test 2
796 ms, 22% slower
Test 3
655 ms, best
Test 4
792 ms, 21% slower

Conclusion

Directly testing for the objects type using is in if, else if blocks is much faster than any other tested method. Note however that the entire type checking can be circumvented using polymorphism (calling a method or property directly on the object instead of trying to find out its type).

Personal tools