私はネストされたtry/catchステートメントについて考えていて、もしあれば、JITがコンパイル済みILの最適化または簡略化を実行できる条件について考え始めました。.NET JITはネストされたtry/catchステートメントを最適化しますか?
説明するために、以下の機能的に同等の例外ハンドラの表現を考えてみましょう。ネストされたtry文のスタックフレーム内には、追加の変数の参照や関数呼び出しが存在しないと仮定すると、
// 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は、スタックフレームは、線形例に崩壊することができると結論することができますか?
ここで、次の例はどうですか?
void Try<TException>(Action action)
{
try
{
action();
}
catch (TException) { }
}
void Main()
{
Try<ExceptionC>(Try<ExceptionB>(Try<ExceptionA>(foo)));
}
私は、デリゲートの呼び出しをインライン化するJITのためのどのような方法があるとは思わないので、この例では、前の1に削減することができません。しかし、foo()
がExceptionC
となった場合、このソリューションは線形の例に比べてパフォーマンスが低下しますか?フレームに含まれる余分なデータは最小限であるにもかかわらず、デリゲートの呼び出しからスタックフレームを分解するために追加のコストがかかると思われます。
最初の2つのケースでILを調べましたか? – womp