Visual Studio构建中“优化代码”选项的好处

33

我们的许多C#发布代码的“优化代码”选项是关闭的。我认为这是为了方便在释放模式下调试代码。

考虑到我们正在创建连接到后端Web服务的相对简单的桌面软件(即不是特别需要处理器密集型应用程序),那么可能会有什么样的性能损失?

是否会有任何特定平台受到更严重的影响?例如,多处理器/64位。


我在很多老旧的公司中看到了这种谬论,它们仍然沉浸在C/C++文化中,而他们(声称)正在尝试转向更新的技术。 - Greg D
@Greg D - 有趣的是,我认为C++文化更喜欢优化 - 或者这不是你的意思? - g t
2
我经常遇到的C++文化“声称”更喜欢优化和“快速代码”,但大多数这样的说法都基于迷信和对任何新事物或不同事物的非理性恐惧。我不否认我所指的文化是功能失调的,但我认为它在这个特定的工作室之外也很普遍。尽管有所有相反的证据,仍然有很多人坚持认为他们的C++代码比一些合理编写的C#代码具有更好的性能特征,例如,“我会自己管理内存,谢谢”。 - Greg D
除了调试环境,这个选项在发布模式下是否有任何注意事项? - petrosmm
现在是2020年,如果我不勾选这个框,我的C# Xamarin.Android应用程序就会崩溃! - gonzobrains
5个回答

34

2
当前链接 https://blogs.msdn.microsoft.com/ericlippert/2009/06/11/what-does-the-optimize-switch-do/ - Dale Brubaker

14
完整的详细信息可在此处查看。
简言之...
在托管代码中,运行时中的JIT编译器几乎完成所有优化。由于此标志产生的生成IL差异很小。

6
我不确定为什么那个引用很重要。即使生成的 IL 没有受到影响,但 JITter 的优化会受到标志的影响,因此该标志将对性能产生影响。原始问题是关于这种差异的程度。 - phoog
此外,我不认为那个链接有任何用处。那是一个2004年的对话,其中那个人误解了JIT与代码优化的作用。 - Spook Kruger

6
事实上,有时会有很大的差别。以下因素会真正影响性能(因为JIT并没有完全处理它们):
- 不必要的局部变量(即每次调用时更大的堆栈帧) - 过于通用的条件指令,JIT以相当直接的方式进行翻译。 - 不必要的分支(对于JIT来说也不是很好-毕竟它没有太多时间进行所有智能优化)
因此,如果您正在进行数字操作,请打开优化选项。否则,您根本看不到任何区别。

你的最终观点并不是不言自明的。非数字代码可能会受益于像深度内联这样的优化。没有具体的来源,我看不出有理由偏向于任何一种方式。 - Max Barraclough

2
编译器所做的优化是相当低级的,不应影响用户的体验。
如果您想量化应用程序的优化效果,只需对非优化版本和优化版本进行性能分析并比较结果即可。

我注意到调试器在存在时会跳过某些行。这是在 VS 2013 和 15 中发现的!有时,为了调试目的,我会将其本地切换关闭。 - arviman

2

我发现对于复杂的CPU密集型代码(我正在使用的代码是一种可以生成足以利用计算机100%线程的Monte Carlo模拟。这在36核环境中进行了测试),性能损失可能高达4倍! 如果没有优化标志,则需要大约9个小时才能完成花费2个小时的模拟。(路径约为500,000,每个路径有500个步骤,涉及大约2000个不同的对象,每个对象都有高度复杂的计算)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接