Visual Studio构建中“优化代码”选项的优点
我们的大部分C#发布代码都是在关闭“优化代码”选项的情况下构建的。 我相信这是为了让发布模式中内置的代码更容易调试。
鉴于我们正在创建相当简单的桌面软件,它连接到后端Web服务(即,不是特别是处理器密集型应用程序),那么如果可能出现任何类型的性能影响呢?
是否有任何特定平台可能受到更严重的影响? 例如。 多处理器/ 64位。
有关详细信息,请访问http://blogs.msdn.com/jaybaz_ms/archive/2004/06/28/168314.aspx 。
简单来说…
在托管代码中,运行时中的JITter几乎完成了所有优化。 生成的IL与此标志的差异非常小。
您是唯一能够回答“性能影响”问题的人。 尝试两种方式,测量性能,看看会发生什么。 命中可能是巨大的,也可能是不存在的; 没有人读到这个知道对你来说“巨大”意味着是一微秒还是二十分钟。
如果您对优化开关打开时C#编译器进行的优化(而不是抖动)感兴趣,请参阅:
http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx
事实上,存在差异,有时甚至非常显着。 什么才能真正影响性能(因为它是JIT没有完全照顾的东西):
- 不必要的局部变量(即每次调用的堆栈帧越大)
- 太通用的条件指令,JIT以非常简单的方式对它们进行翻译。
-
不必要的分支(JIT也不能很好地完成 – 毕竟,它没有太多时间来进行所有智能优化)
所以,如果你正在做一些数字化的事情 – 打开优化。 否则你根本不会看到任何差异。
编译器完成的优化程度相当低,不应影响用户的体验。
如果您想量化应用程序的优化,只需分析未优化和优化的构建并比较结果。
我发现使用复杂的CPU密集型代码(我使用的代码是蒙特卡罗模拟,它可以产生足够的线程以100%利用计算机。这在36核环境中进行了测试)性能命中可达4倍高! 如果没有优化标记,需要2小时的模拟大约需要9个小时。 (路径大约为500,000,对于每个路径,大约有2000个不同的对象有500个步骤,每个对象的计算非常复杂)。
- 如何将所包含的项添加到文档注释中
- 本地化和DataAnnotations。 GlobalResourceProxyGenerator和PublicResxFileCodeGenerator
- 我们使用BouncyCastle API为客户端加密文件。 在尝试解密时,他从PGP获得了“仅供您选择”的消息。 为什么?
- entity framework核心/ SQLite:加入“扁平化”结果后的GroupJoin
- 来自数据库的ASP.NET MVC下拉列表
- 使用entity framework使用存储库和单元工作模式正确处置?
- Automapper – 将多对多关联映射到平面对象的最佳实践
- 等待Task.Delay()延迟预期的时间
- 将字符串值转换为hex十进制