pit*_*met 0 c# compiler-optimization
在c#中,空的try catch块花费了多少时间?
我听说它介于10-55ms之间,但我倾向于零/一,因为编译器将用无操作占位符替换空try catch.
任何可以验证这些信息的编译专家?
如果你说"空尝试捕获块",你的意思是字面意思:
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毫秒"附近.