我一直在考慮嵌套的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) { }
假定沒有額外的變量引用或嵌套try語句的堆棧幀中的函數調用,可以在JIT斷定該堆棧幀可被摺疊到線性例子?
現在下面的例子怎麼樣?
void Try<TException>(Action action)
{
try
{
action();
}
catch (TException) { }
}
void Main()
{
Try<ExceptionC>(Try<ExceptionB>(Try<ExceptionA>(foo)));
}
我不認爲有任何方式的JIT內聯委託調用,所以這個例子不能降低到以前的一個。然而,如果foo()
引發ExceptionC
,與線性示例相比,此解決方案性能較差嗎?我懷疑從委託調用中拆除堆棧幀會有額外的成本,即使幀中包含的額外數據很少。
您是否看過前兩種情況下的IL? – womp 2009-07-10 07:13:09