2016-10-02 1 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 문이 예외가 throw되는 것을 막을 때 try-catch를 사용하지 않아야하는 이유에 대한 설명을 보여줍니다. 실제 숫자,이 간단한 테스트 프로그램을 작성했습니다.

try-catch result: 
00:00:32.6764911 

if-statement result: 
00:00:00.0001047 

당신이 볼 수 있듯이, 시도 - 캐치 접근 방식에 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

* 스택 추적 * (예외가 throw 된 경우) 작업을 아주 시간을 초월합니다 (smple'if'와 비교) –

+0

우수 답변! 3,000,000 %는 미친 짓이야! 하하 – Vermacian55