2012年2月2日 星期四

[AS3]IF和 SWITCH 的比較

在公司我看到一些用IF的判斷~
我就一直想改成SWTICH版的~
不過想想不知到那一種比較好~
所以我就來試看看~

個人的想法是 如果項數多
應該是SWTICH會比較快~
因為IF是多次判斷
所以來測試了一下~

如果是兩個選項的

testIf函數執行100000次 消耗的時間為71毫秒 消耗 0 記憶體 平均每次時間為 0.00071毫秒
testSwitch函數執行100000次 消耗的時間為72毫秒 消耗 0 記憶體 平均每次時間為 0.00072毫秒


四個選項的

testIf函數執行100000次 消耗的時間為70毫秒 消耗 0 記憶體 平均每次時間為 0.0007毫秒
testSwitch函數執行100000次 消耗的時間為72毫秒 消耗 0 記憶體 平均每次時間為 0.00072毫秒

10個選項的


testIf函數執行100000次 消耗的時間為74毫秒 消耗 0 記憶體 平均每次時間為 0.00074毫秒
testSwitch函數執行100000次 消耗的時間為75毫秒 消耗 0 記憶體 平均每次時間為 0.00075毫秒

不過以上是在數據平均的情況下~

如果數字不平均~會讓IF多次判斷的話
十個選項的

testIf函數執行100000次 消耗的時間為69毫秒 消耗 0 記憶體 平均每次時間為 0.00069毫秒
testSwitch函數執行100000次 消耗的時間為67毫秒 消耗 0 記憶體 平均每次時間為 0.00067毫秒

平均的話
我是改 teatInit 把數字給的和選項一樣多
那 IF 會比 SWTICH 稍快一點
如果 10個選項 但是產生的數字只從 0~5
會差多一點
如果只有 0~3那會差快一被
不過看起來 還是使用 if會比較好

下面是我的程式碼~
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
  xmlns:s="library://ns.adobe.com/flex/spark" 
  xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
 applicationComplete="init();"
  >
<fx:Script>
<![CDATA[
import com.tenchiwang.unitTest.unitTestFunObj;
import com.tenchiwang.unitTest.unitTestTool;

private var arr:Array;
private function init():void
{
//switch
teatInit();
unitTestTool.addFunction('testIf', this, new Array(arr), 'testIf');
unitTestTool.addFunction('testSwitch', this, new Array(arr), 'testSwitch');
unitTestTool.startFunTest(100000);
trace(unitTestTool.DETAIL);
}

public function testIf(arr:Array):void
{
for(var i:int = arr.length-1;i<0;i--)
{
if(arr[i]==1)
{
test01();
}
else if(arr[i]==2)
{
test01();
}else if(arr[i]==3)
{
test01();
}else if(arr[i]==4)
{
test01();
}else if(arr[i]==5)
{
test01();
}else if(arr[i]==6)
{
test01();
}else if(arr[i]==7)
{
test01();
}else if(arr[i]==8)
{
test01();
}else if(arr[i]==9)
{
test01();
}else if(arr[i]==0)
{
test01();
}
else
{
test01();
}
}
}

public function testSwitch(arr:Array):void
{
for(var i:int = arr.length-1;i<0;i--)
{
switch(arr[i])
{
case 1:
test01();
break;
case 2:
test01();
break;
case 3:
test01();
break;
case 4:
test01();
break;
case 5:
test01();
break;
case 6:
test01();
break;
case 7:
test01();
break;
case 8:
test01();
break;
case 9:
test01();
break;
case 0:
test01();
break;
default:
test01();
}
}
}

private function teatInit():void
{
arr = new Array();
for(var i:int= 0;i<10000;i++)
{
arr.push(int(Math.random()*5));
}
}

private function test01():void
{
var tot:Number = 0;
for(var i:int= 0;i<10000;i++)
{
tot+= Math.random();
}
}
]]>
</fx:Script>
</s:Application>