2016-10-02 6 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を使用しない理由を説明していますが、実際の数、私はこの簡単なテストプログラムを書いた。

try-catch result: 
00:00:32.6764911 

if-statement result: 
00:00:00.0001047 

あなたが見ることができるように、のtry-catchアプローチは上の10,000サイクルを完了するまでに30秒以上を取って、例外が引っ掛かり大きなオーバーヘッドが導入されています

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); 

プログラムの結果はこれです私のマシン。一方、if文は非常に速く実行されるため、基本的に瞬間的です。 try-catchと比較して、これは300万%近くのパフォーマンス改善です。

(これは厳密なベンチマークではなく、より正確な数値を得るために別の方法で記述し実行する方法がありますが、if可能であれば、try-catchを使用してください。)

+1

*スタックトレース*(例外がスローされたとき)は非常に時間がかかります(スンプル 'if'と比較して) –

+0

優れた答え! 300万%が狂っている!ハハ – Vermacian55

関連する問題