debugging与发布性能

我遇到以下几段:

当您在Visual Studio中编译代码时,“IDE中的Debug vs. Release设置与性能几乎没有区别…生成的代码几乎相同。 C#编译器没有做任何优化。 C#编译器只是吐出了IL …而在运行时它是JITer完成所有的优化。 JITer确实有debugging/发布模式,这对性能有很大的影响。 但是,这并不关键你是否运行你的项目的debugging或发布configuration,关键是debugging器是否连接。

来源在这里 ,播客在这里 。

有人可以指导我一个微软的文章,实际上可以certificate这一点?

谷歌search“ C#debuggingvs发布性能 ”主要返回结果说“ debugging有很多性能打击 ”,“ 发布已优化 ”,“ 不debugging生产部署 ”。

部分正确。 在debugging模式下,编译器为所有variables发出debugging符号,并按原样编译代码。 在发布模式中包含一些优化:

  • 未使用的variables根本不会被编译
  • 一些循环variables如果被certificate是不variables,就被编译器从循环中取出
  • 不包含在#debug指令下的代码

剩下的就是JIT。

编辑:优化的完整列表在这里由Eric Lippert提供

没有文章“certificate”任何关于performance问题的文章。 certificate变更对性能影响的断言的方法是尝试两种方法,并在现实但控制的条件下对其进行testing。

你问一个关于性能的问题,显然你关心性能。 如果你关心性能,那么正确的做法是设置一些性能目标,然后写一个testing套件来跟踪你的进展情况。 一旦你有了这样一个testing套件,你就可以很容易地使用它来testing自己的真相或虚假的语句,如“debugging版本更慢”。

而且,你将能够得到有意义的结果。 “较慢”是没有意义的,因为不清楚是慢一微秒还是慢二十分钟。 “在现实条件下慢10%”更有意义。

花时间在网上研究这个问题,build立一个能够回答问题的设备。 这样你会得到更准确的结果。 你在网上阅读的任何内容只是猜测 可能发生的事情。 你从自己的事实中收集到的理由,而不是其他人对你的程序行为的猜测。

我不能评论性能,但是build议“不要部署debugging到生产”仍然只是因为debugging代码在大型产品中通常会做很多不同的事情。 首先,你可能有debugging开关激活,另一个可能会有额外的冗余健全性检查和debugging输出不属于生产代码。

从msdn社交

这是没有很好的文件,这是我所知道的。 编译器发出System.Diagnostics.DebuggableAttribute的一个实例。 在debugging版本中,IsJitOptimizerEnabled属性为True,在发行版本中为False。 您可以使用ildasm.exe在程序集清单中看到此属性

JIT编译器使用此属性禁用优化,这将使debugging变得困难。 移动代码如循环不变的提升。 在选定的情况下,这可以在性能上有很大的不同。 虽然通常不。

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

由于禁用了JIT编译器优化,所以基本上debugging部署将会比较慢。

你读的是相当有效的。 由于JIT优化,释放通常更加精简,不包括debugging代码(#IF DEBUG或[Conditional(“DEBUG”)]),最小的debugging符号加载,通常不被考虑的是较小的程序集,这将减less加载时间。 在VS中运行代码时性能不同更为明显,因为更广泛的PDB和加载的符号,但是如果单独运行它,性能差异可能不那么明显。 某些代码会比其他代码优化得更好,并且与其他语言一样使用相同的优化启发式。

Scott在这里对内联方法优化有很好的解释

请参阅本文 ,简要说明为什么它在ASP.NET环境中用于debugging和发布设置的不同。

有一件事情你应该注意,关于性能和debugging器是否附加,这让我们感到惊讶。

我们有一段代码,涉及许多紧密的循环,似乎需要永远debugging,但是运行得很好。 换句话说,没有遇到问题的客户或客户,但是当我们debugging时,似乎像糖浆一样运行。

罪魁祸首是一个Debug.WriteLine在其中一个紧密的循环,其中吐出成千上万的日志消息,从一个debugging会议后退。 看起来,当debugging器被连接并监听这样的输出时,会有开销,从而减慢了程序的速度。 对于这个特定的代码,它自己的运行时间是0.2-0.3秒,debugging器连接的时间是30+秒。

简单的解决scheme,只是删除不再需要的debugging消息。

在msdn网站…

发布与debuggingconfiguration

当您仍在处理项目时,通常使用debuggingconfiguration来构build应用程序,因为此configuration使您能够查看variables的值并在debugging器中控制执行。 您还可以在发行版configuration中创build和testing版本,以确保您没有引入任何只在一种版本或另一种版本上出现的错误。 在.NET Framework编程中,这样的错误是非常罕见的,但可能会发生。

当您准备将应用程序分发给最终用户时,请创build一个发布版本,该发布版本将小得多,并且通常比相应的debuggingconfiguration具有更好的性能。 您可以在“项目devise器”的“构build”窗格中或“构build”工具栏中设置构buildconfiguration。 有关更多信息,请参阅构buildconfiguration。

在很大程度上,这取决于你的应用程序是否受计算机限制,并不总是很容易讲出来,如Lasse的例子。 如果我对它正在做什么有丝毫的疑问,我会暂停几次,然后检查一下堆栈。 如果还有一些额外的事情,我真的不需要,那就马上点。

我最近遇到了性能问题。 产品的完整列表花费了很多时间,大约80秒。 我调整了数据库,改进了查询,没有任何区别。 我决定创build一个TestProject,我发现在4秒钟内完成了相同的工作。 然后我意识到该项目处于debugging模式,testing项目处于“发行”模式。 我将主项目切换到发布模式,产品完整列表仅花费4秒钟显示所有结果。

总结:debugging模式比运行模式慢得多,因为它保持debugging信息。 您应该始终以Relase模式进行部署。 如果包含.PDB文件,您仍然可以获得debugging信息。 那样的话,你可以用行号logging错误,例如。