调试与发布性能

我遇到以下段落:

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

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

有人可以指引我看看能够证明这一点的微软文章吗?

谷歌搜索“C#调试vs发布性能”主要返回结果说“调试有很多性能问题”,“发布已优化”,以及“不将调试部署到生产”。


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

  • 未使用的变量根本不会被编译
  • 如果一些循环变量被证明是不变量,那么一些循环变量会被编译器从循环中取出
  • 不包含在#debug指令下编写的代码等。
  • 其余的由JIT决定。

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


    没有哪篇文章能够“证明”任何关于表现问题的文章。 证明变更对性能影响的断言的方法是尝试两种方法并在现实但控制的条件下对其进行测试。

    你问一个关于性能的问题,显然你关心性能。 如果你关心性能,那么正确的做法是设置一些性能目标,然后为自己编写一个测试套件,跟踪你的进度与这些目标的关系。 一旦你有了这样一个测试套件,你就可以很容易地使用它来测试自己的真实性或虚假性,比如“调试版本比较慢”。

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

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


    我无法对性能发表评论,但建议“不要将调试部署到生产环境”仍然存在,只是因为调试代码通常在大型产品中做了很多不同的事情。 首先,您可能会使调试开关处于活动状态,对于另一个则可能会有额外的冗余健全性检查和调试输出,这些不属于生产代码。

    链接地址: http://www.djcxy.com/p/80607.html

    上一篇: Debug vs. Release performance

    下一篇: Common reasons for bugs in release version not present in debug mode