C#编译器是否优化了空的try/catch?

pit*_*met 0 c# compiler-optimization

在c#中,空的try catch块花费了多少时间?

我听说它介于10-55ms之间,但我倾向于零/一,因为编译器将用无操作占位符替换空try catch.

任何可以验证这些信息的编译专家?

Chr*_*air 5

如果你说"空尝试捕获块",你的意思是字面意思:

try
{
}
catch
{
}
Run Code Online (Sandbox Code Playgroud)

然后是的,当打开编译器优化(即"释放"模式)构建时,它不会发出任何IL指令.例如:

private void Test()
{
    try
    {
    }
    catch
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

编译为:

IL_0000:  ret
Run Code Online (Sandbox Code Playgroud)

这与它是一个空方法是一样的.

但是,当关闭优化(即"调试"模式)时,它会发出:

IL_0000:  nop         
IL_0001:  nop         
IL_0002:  nop         
IL_0003:  leave.s     IL_000A
IL_0005:  pop         
IL_0006:  nop         
IL_0007:  nop         
IL_0008:  leave.s     IL_000A
IL_000A:  nop         
IL_000B:  ret 
Run Code Online (Sandbox Code Playgroud)

而空方法将是:

IL_0000:  nop         
IL_0001:  ret 
Run Code Online (Sandbox Code Playgroud)

在执行JIT编译器时是否剥离了这些IL指令,我并不乐观.但是这仍然只适用于没有编译器优化的编译,因为在它们到达JIT编译器之前,在初始编译到IL期间,try/catch被剥离了.

编辑:我刚才意识到我可能没有真正回答过这个问题:

释放模式下,空的try/catch消耗零时间.
调试模式下,空的try/catch会消耗非零时间,因为它仍会为调试/断点目的发出必要的IL代码,并且需要一些 JIT编译.但是,这将是一个可以忽略不计的时间.绝对没有"10-55毫秒"附近.