2014-03-13 45 views
0

在c#中,在空的try catch块中花费了多少时间?C#编译器是否优化了空的try/catch?

我听说这是10-55ms之间,但我偏向于零/一个因为编译器会用一个空操作占位符代替空尝试捕捉。

任何可以验证此信息的编译器专家?

+0

我相信你得到这么多downvotes的原因是,这可能不是合适的地方要问这个特定问题... – Jfabs

+3

您可以查看生成的IL /字节码自己。 [我如何查看C#编译器生成的MSIL/CIL?为什么叫集合?](http://stackoverflow.com/questions/3326571/how-can-i-view-msil-cil-generated-by-c-sharp-compiler-why-is-it-called-集合) –

+2

确保选择一个好的标题,它确实有助于避免负面的初始反应/投票。已经提出的假设和基本问题是“我倾向于零/一,因为编译器将用一个无操作占位符替换空的try catch”,所以关注这一点。 – user2864740

回答

5

如果当你说 “空try catch块”,你的意思是字面上

try 
{ 
} 
catch 
{ 
} 

然后是,建立在与编译器优化开启(即“释放“模式),它不会发出任何IL指令。例如:

private void Test() 
{ 
    try 
    { 
    } 
    catch 
    { 
    } 
} 

编译为:

IL_0000: ret 

这是相同的,就好像它是一个空的方法。

然而,当优化导通关闭(即 “调试” 模式)时,它发出:

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 

鉴于空方法将是:

IL_0000: nop   
IL_0001: ret 

无论是否这些IL指令在执行编译器时被剥离,我不积极。但是,这仍然只适用于没有编译器优化的情况下进行编译,因为在启动JIT编译器之前,在初始编译为IL期间,try/catch会被剥离。

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

释放模式,零时间是在一个空的try/catch消耗。
调试模式,一个非零时间用于空try/catch,因为它仍然发出必要的IL代码以用于调试/断点目的,并且需要一些 JIT编译。但是,这将是一个可以忽略的小时间量。绝对无处附近的“10-55毫秒”附近。

+0

正确!谢谢 – pithhelmet

2

如果检查通过适当的软件编译后的代码(如ILspy或反射器),你可以看到空块将被删除由编译器completley。

ILSpy image

+5

未来,你会想要备份你的答案与来源等 – Jfabs

+0

@Jfabs检查这个http://prntscr.com/30ielc(我希望我得到这个问题的权利,因为主题的名称是相当混淆) –

+0

看起来你对我来说是正确的。感谢您的跟进。我建议你编辑你的文章,以包含该截图作为你的陈述的证据。 – Jfabs