什么是“优化代码”选项在Visual Studio中真正做什么?

该选项的名称告诉了什么,但Visual Studio /编译器真的做什么,真正的后果是什么?

编辑:如果你search谷歌,你可以find这个地址 ,但是这不是真的我在找。 我不知道真实的事情发生。 例如,为什么循环获得更less的时间,等等

如果不进行优化,编译器会生成非常笨的代码 – 每个命令都以非常简单的方式进行编译,从而完成预期的任务。 Debug版本默认情况下禁用了优化,因为没有优化生成的可执行文件以直接方式匹配源代码。

variables保存在寄存器中

一旦开启了优化,编译器会应用许多不同的技术,使代码运行得更快,同时仍然保持原样。 Visual C ++中优化和未优化版本之间最明显的区别是variables值在优化版本中尽可能长地保存在寄存器中,而没有优化时,它们始终存储在内存中。 这不仅会影响代码速度,还会影响debugging。 作为这种优化的结果,debugging器不能可靠地获得一个variables值,因为您正在逐步完成代码。

其他优化

编译器应用了多个其他优化,如/ O选项(优化代码)MSDN文档中所述 。 有关各种优化技术的一般说明,请参阅Wikipedia Compiler Optimization文章 。

从Paul Vick的博客:

  • 它删除了任何我们会发出来帮助debugging的NOP指令。 当优化closures(并且打开debugging信息)时,编译器将为没有任何实际的IL关联的行发出NOP指令,但是您可能想要放置一个断点。 最常见的例子就是“If”语句的“End If” – 没有为End If发出实际的IL,所以我们不发出NOP,debugging器不会让你设置一个断点在上面。 开启优化会强制编译器不要发出NOP。

  • 我们对生成的IL进行一个简单的基本块分析,以删除任何死代码块。 也就是说,我们将每个方法分解成由分支指令分隔的IL块。 通过快速分析块如何相互关联,我们可以确定任何没有分支的块。 因此,我们可以找出永远不会被执行的代码块,并且可以省略,使组件略小。 在这一点上,我们也做了一些小的分支优化 – 例如,如果您转到另一个GoTo语句,我们只是优化第一个GoTo跳转到第二个GoTo的目标。

  • 我们发出一个DebuggableAttribute与IsJITOptimizerDisabled设置为False。 基本上,这允许运行时JIT优化代码,使其看起来合适,包括重新sorting和内联代码。 这将产生更有效率和更小的代码,但这意味着试图debugging代码可能是非常具有挑战性的(任何人都会试用它会告诉你)。 JIT优化的实际列表是我不知道的东西 – 也许像Chris Brumme这样的人会在某个时刻join。 不pipe多长时间,优化开关都会使优化成为可能,因为优化可能会导致设置断点并加大代码难度。

简短的答案是:使用-Ox并让编译器完成它的工作。

漫长的回答:不同types优化的效果是不可能准确预测的。 有时,对于快速代码的优化实际上会产生比优化大小更小的代码。 如果您真的想要获得最后的0.01%的性能(速度或按比例),则必须对不同的选项组合进行基准testing。

此外,最近版本的Visual Studio有更多高级优化选项,如链接时间优化和简档引导优化。