2009-02-05 3 views
4

업데이트 : 나는 그대로두고 갈거야 왼쪽과 오른쪽이가 OverflowException을 throw합니다 충분히 큰 경우, 물론C#에서 오버 플로우 상황을 정상적으로 테스트하려면 어떻게해야합니까? 내가 노력하고있어</p> <hr> <p>(매우 드문)이 예외의 성능 저하 (공통) 각 작업에 대한 확인을 위해 아마 성능 저하보다 낫다 :

estimatedRowCount = left.EstimatedRowCount * right.EstimatedRowCount; 
return estimatedRowCount; 

: 한 경우에 함께 결합되는 두 개의 하위 커서의 제품이 될 것이라고에 "EstimatedRowCount"를 지원합니다.

여기 estimateRowCount가 100 % 정확하고 커서가 많은 데이터를 보유하고 있음을 알기에 충분히 크지는 않습니다.

// We multiply our rowcount 
Int64 estimRowCount = 0; 
try 
{ 
    estimRowCount = leftRowCount * rightRowCount; 
} 
catch (OverflowException) 
{ 
    // Ignore overflow exceptions 
    estimRowCount = Int64.MaxValue; 
} 

return estimRowCount; 

더 나은 오버 플로우 작업을 테스트하는 방법 내가 보호하기 위해 시도 {} 캐치 할 필요가 없습니다이 있습니까 : 지금

, 나는이 일을 해요?

답변

4

'unchecked' keyword의 좋은 사용법처럼 들립니다.

다음
Int64 estimRowCount = 0; 
unchecked 
{ 
    estimRowCount = leftRowCount * rightRowCount; 
} 

는 결과가 부정적 있는지 확인하기 위해 테스트 -이 경우, 그것은 오버 플로우 :

단순히 '선택 해제'블록에 할당 포장, 사용

if (estimRowCount > 0) estimRowCount = Int64.MaxValue; 

당신 이 경우 leftRowCount와 rightRowCount가 음수가 될 수 없도록해야합니다. 그러나 문맥이 주어지면 나는 그것이 발생할 것이라고 생각하지 않습니다.

+0

이것은 필요할 때까지 알지 못하는 모호한 언어 기능 중 하나입니다. = P –

3

귀하의 솔루션은 상당히 합리적입니다. 특정 항목을 최적화하고 싶습니까? 해당 제품이 오버플로 조건을 너무 자주 발생시켜 예외 처리의 성능에 대해 걱정할 필요가 있습니까?

(생각에 그냥 간단한 음식, leftRowCount 및 rightRowCount은 INT32,하지 INT64, 당신의 제품이 INT64 estimRowCount의 좌변을 오버 플로우 수 없습니다. 경우)

+0

모든 것이 Int64입니다. 그리고 이것은 가능하다면 믿음이 "예외 처리를위한 히트를 피하지"않는 곳에서 학습함으로써 "조기 최적화"일 것입니다. – Eli

4
 

if (Int64.MaxValue/leftRowCount <= rightRowCount) 
{ 
    estimRowCount = leftRowCount * rightRowCount 
} 
else 
{ 
    estimRowCount = Int64.MaxValue; 
} 

확실하지 내가 설명 할 수있는 경우 편집자없이 나 자신. 하지만 아이디어를 얻길 바랍니다.

+0

그래서 이제는 미스에 대한 예외를 처리하는 것보다 각 계산에 대해 이것을 확인하는 것이 더 효율적인지 여부가 문제입니다. – Eli

+0

확실하지 않습니다. 그런데 왜이 작은 물건에 대해 걱정합니까? – shahkalpesh

+0

나는 작은 물건이 큰 물건이되는 단단한 고리에서 달리게되기 때문에 그가 이것과 같은 작은 물건에 대해 걱정하고 있다고 확신한다. 그러나 나는 너의 제안을 너무 좋아한다. 나는 호기심 때문에 정밀도가 높은 타이머로 두 가지 변종을 테스트하고 싶다. – JMD