我们的大部分 C# 发布代码都是在关闭“优化代码”选项的情况下构建的。我相信这是为了让在 Release 模式下构建的代码更容易调试。
鉴于我们正在创建连接到后端 Web 服务的相当简单的桌面软件(即不是一个特别占用处理器的应用程序),那么如果可能会出现任何类型的性能损失怎么办?
是否有任何特定平台可能受到更严重的影响?例如。多处理器/64 位。
我们的大部分 C# 发布代码都是在关闭“优化代码”选项的情况下构建的。我相信这是为了让在 Release 模式下构建的代码更容易调试。
鉴于我们正在创建连接到后端 Web 服务的相当简单的桌面软件(即不是一个特别占用处理器的应用程序),那么如果可能会出现任何类型的性能损失怎么办?
是否有任何特定平台可能受到更严重的影响?例如。多处理器/64 位。
您是唯一可以回答“性能命中”问题的人。尝试两种方式,衡量性能,看看会发生什么。打击可能很大,也可能不存在;没有人知道“巨大”对你来说意味着一微秒还是二十分钟。
如果您对打开优化开关时 C# 编译器进行哪些优化而不是抖动感兴趣,请参阅:
http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx
完整的详细信息可在http://blogs.msdn.com/jaybaz_ms/archive/2004/06/28/168314.aspx获得。
简单来说...
在托管代码中,运行时中的 JITter 几乎完成了所有优化。从这个标志生成的 IL 的差异非常小。
事实上,这是有区别的,有时相当显着。真正影响性能的因素(因为它是 JIT 没有完全解决的问题):
不必要的局部变量(即,每次调用更大的堆栈帧)
过于通用的条件指令,JIT 以非常直接的方式翻译它们。
不必要的分支(JIT 也不能很好地服务 - 毕竟,它没有太多时间来进行所有智能优化)
所以,如果你正在做一些数字 - 打开优化。否则你根本看不到任何区别。
编译器所做的优化相当低级,不应该影响您的用户体验。
如果您想量化应用程序的优化,只需分析未优化和优化的构建并比较结果。
我发现对于复杂的 CPU 密集型代码(我使用的代码是 Monte Carlo 模拟,它可以产生足够多的线程以 100% 使用计算机。这是在 36 核环境中测试的),性能损失可能高达 4高几倍!如果没有优化标志,需要 2 小时的模拟将需要大约 9 小时。(路径大约有 500,000 条,每条路径有 500 个步骤,用于大约 2000 个不同的对象,每个对象的计算非常复杂)。