나는 중첩 된 try/catch 문에 대해 생각 해왔고 JIT가 컴파일 된 IL의 최적화 또는 단순화를 수행 할 수있는 조건을 고려하기 시작했습니다..NET JIT는 중첩 된 try/catch 문을 최적화합니까?
설명하기 위해 예외 처리기와 기능적으로 동일한 다음과 같은 표현을 고려하십시오.
// Nested try/catch
try
{
try
{
try
{
foo();
}
catch(ExceptionTypeA) { }
}
catch(ExceptionTypeB) { }
}
catch(ExceptionTypeC) { }
// Linear try/catch
try
{
foo();
}
catch(ExceptionTypeA) { }
catch(ExceptionTypeB) { }
catch(ExceptionTypeC) { }
이 추가 변수 참조가 없거나 기능은 JIT는 스택 프레임이 선형 예를 축소 할 수 있다는 결론을 내릴 수, 중첩 된 try 문의 스택 프레임 내에서 호출 가정?
다음 예는 어때?
void Try<TException>(Action action)
{
try
{
action();
}
catch (TException) { }
}
void Main()
{
Try<ExceptionC>(Try<ExceptionB>(Try<ExceptionA>(foo)));
}
내가 대리자 호출을 인라인 할 수있는 JIT 수있는 방법이 있다고 생각하지 않기 때문에이 예는 이전에 감소 할 수 없습니다. 그러나 foo()
이 ExceptionC
일 때,이 솔루션은 선형 예와 비교할 때 더 열악합니까? 프레임에 포함 된 추가 데이터가 최소 임에도 불구하고 대리자 호출에서 스택 프레임을 찢어 버리는 데 추가 비용이 든다 고 생각됩니다.
처음 두 경우에 대해 일리노이를 살펴 보셨습니까? – womp