C#Debug vs Release

时间:2010-08-06 05:59:15

标签: c# debugging release

在调试版本和发布版本之间,Windows服务可以获得多少性能提升(如果有的话)?为什么?

2 个答案:

答案 0 :(得分:6)

对于托管代码,除非你有很多东西有条件地编译为DEBUG构建,否则应该没有什么区别 - IL应该几乎相同。在调试器下运行时,抖动的生成方式不同 - 对IL的编译不会受到太大影响。

/optimize在编译IL时会有一些事情,但它们并不是特别具有攻击性。其中一些IL优化可能会由抖动优化处理,即使它们没有在IL中进行优化(如删除nops)。

有关详细信息,请参阅Eric Lippert的文章http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx

  

/ optimize标志不会改变我们的大量发射和生成逻辑。我们尝试始终生成简单,可验证的代码,然后依靠抖动在生成真实机器代码时进行大量优化。但是我们将使用该标志集进行一些简单的优化。

阅读Eric的文章,了解/optimize在IL生成方面的确有所不同。

答案 1 :(得分:1)

嗯,虽然问题是重复的,但我觉得原始问题中的一些更好的答案是最底层的。就个人而言,我已经看到调试和发布模式之间存在明显差异的情况。 (示例:Property performance,其中在调试和发布模式下访问属性之间存在2倍的差异)。这种差异是否会出现在实际的软件中(而不是像程序这样的基准)是有争议的,但我已经看到它发生在我工作的一个产品中。

来自Neil对原始问题的回答,来自msdn social

  

没有详细记录,这是我所知道的。编译器发出System.Diagnostics.DebuggableAttribute的实例。在调试版本中,IsJitOptimizerEnabled属性为True,在发行版本中为False。您可以使用ildasm.exe在程序集清单中看到此属性。

     

JIT编译器使用此属性来禁用会使调试变得困难的优化。像循环不变的提升一样移动代码的那些。在选定的情况下,这可以在性能上产生很大的不同。虽然不常见。

     

将断点映射到执行地址是调试器的工作。它使用.pdb文件和JIT编译器生成的信息,它为代码地址映射提供IL指令。如果你要编写自己的调试器,你可以使用ICorDebugCode :: GetILToNativeMapping()。