C# C编译器是否优化了一个空的try/catch?
在c语言中,在一个空的try-catch块中花费了多少时间 我听说它在10-55毫秒之间,但我倾向于0/1,因为编译器将用无操作占位符替换空的try-catchC# 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 { }
任何能够验证此信息的编译器专家?如果您使用适当的软件(如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