2016-10-02 197 views
1

我對try catch的瞭解是有限的。但我想知道它是否可以用來獲得表現。嘗試捕捉性能c#

例子中,我創建這個體素引擎,其中一個功能是這樣的:

Block GetBlockInChunk(Vector Position){ 
    if(InBound(Position)){ 
     return Database.GetBlock(); 
    } 
    return null; 
} 

這必須檢查給定位置的範圍,使用嘗試捕捉,那麼你可以刪除它們?

Block GetBlockInChunk(Vector Position){ 
    try{ 
     return Database.GetBlock(); 
    } 
    catch{ 
     return null; 
    } 
} 

我覺得這可能是可怕的做法,但我很好奇。

+0

'try..catch'引入開銷並且不提升性能AFAIK。 – user3185569

+1

它也適用於*特殊*情況,不適用於默認情況。在這裏檢查邊界似乎是比讓它拋出異常更好的方法。 –

+0

請參閱http://stackoverflow.com/questions/8687113/if-condition-vs-exception-handler – Abion47

回答

4

我在上面的評論中提供的鏈接顯示了爲什麼在if語句會阻止異常被拋出時爲什麼不應該使用try-catch,但爲了顯示性能實際數字,我寫了這個快速的小測試程序。

Stopwatch watch = new Stopwatch(); 

int[] testArray = new int[] { 1, 2, 3, 4, 5 }; 
int? test = null; 

watch.Start(); 
for (int i = 0; i < 10000; i++) 
{ 
    try 
    { 
     testArray[(int)test] = 0; 
    } 
    catch { } 
} 
watch.Stop(); 

Console.WriteLine("try-catch result:"); 
Console.WriteLine(watch.Elapsed); 
Console.WriteLine(); 

watch.Restart(); 
for (int i = 0; i < 10000; i++) 
{ 
    if (test != null) 
     testArray[(int)test] = 0; 
} 
watch.Stop(); 

Console.WriteLine("if-statement result:"); 
Console.WriteLine(watch.Elapsed); 

程序的結果是這樣的:

try-catch result: 
00:00:32.6764911 

if-statement result: 
00:00:00.0001047 

正如你所看到的,在try-catch方法引入異常時被逮住顯著的開銷,同時在30秒內就完成10000次我的機器。另一方面,if語句的運行速度非常快,基本上是瞬時的。與try-catch相比,這是在3,000,000%附近的性能改善。 (這不是一個嚴格的基準,並且有辦法編寫它並以不同的方式運行它以獲得更精確的數字,但是這應該給你一個很好的想法,即使用if - 儘可能在try-catch上聲明。)

+1

*堆棧跟蹤*(拋出異常時)非常耗時操作(與「if」相比較) –

+0

優秀的答案! 300萬%是瘋了!哈哈 – Vermacian55