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

C# C编译器是否优化了一个空的try/catch?,c#,compiler-optimization,C#,Compiler Optimization,在c语言中,在一个空的try-catch块中花费了多少时间 我听说它在10-55毫秒之间,但我倾向于0/1,因为编译器将用无操作占位符替换空的try-catch 任何能够验证此信息的编译器专家?如果您使用适当的软件(如ILspy或Reflector)检查编译后的代码,您可以看到编译器将完全删除空块 如果你说空的话,试着抓块,你的意思是: 然后是的,当编译优化打开时,也就是发布模式,它不会发出任何IL指令。例如: private void Test() { try { }

在c语言中,在一个空的try-catch块中花费了多少时间

我听说它在10-55毫秒之间,但我倾向于0/1,因为编译器将用无操作占位符替换空的try-catch


任何能够验证此信息的编译器专家?

如果您使用适当的软件(如ILspy或Reflector)检查编译后的代码,您可以看到编译器将完全删除空块


如果你说空的话,试着抓块,你的意思是:

然后是的,当编译优化打开时,也就是发布模式,它不会发出任何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编译器执行时被剥离,我都不能肯定。但这仍然只适用于在没有编译器优化的情况下进行编译的情况,因为在打开编译器的情况下,try/catch在最初编译到IL时会在到达JIT编译器之前被剥离

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

在释放模式下,在空的try/catch上花费的时间为零。
在调试模式下,空的try/catch会花费非零时间,因为它仍然会发出必要的IL代码以进行调试/断点,并且需要一些JIT编译。然而,这将是一个可以忽略不计的时间量。肯定离10-55毫秒远得不远。

我认为,你得到这么多反对票的原因是,这里可能不是提出这个特定问题的合适地方……你可以自己查看生成的IL/字节码。确保选择一个好的标题,它确实有助于避免负面的最初反应/投票。已经提出的假设和基本问题是,我倾向于0/1,因为编译器将用一个无运算占位符替换空的try-catch,所以请关注这一点。当你说空的try-catch块时,你的意思是如果你真的有:try{}catch{}?这个问题的实际应用是什么?在未来,你需要用来源和数据来备份你的答案such@Jfabs勾选这个,我希望我能正确回答这个问题,因为这个主题的名字很有说服力,看起来你们对我来说是对的。谢谢你的跟进。我建议你编辑你的帖子,把截图作为你声明的证据。
IL_0000:  nop         
IL_0001:  ret