“优化代码”选项在Visual Studio中的作用是什么?

时间:2008-09-22 08:51:30

标签: visual-studio optimization

该选项的名称可以说明Visual Studio /编译器的真正含义以及真正的后果是什么?

编辑:如果您搜索谷歌,您可以找到this address,但这不是我真正想要的。我想知道真实的事情发生了。例如,为什么循环会花费更少的时间等等。

3 个答案:

答案 0 :(得分:59)

如果没有优化,编译器会产生非常愚蠢的代码 - 每个命令都以非常简单的方式编译,因此它可以完成预期的操作。 Debug构建默认情况下禁用了优化,因为没有优化,生成的可执行文件会以简单的方式匹配源代码。

变量保存在寄存器

一旦打开优化,编译器会应用许多不同的技术来使代码运行得更快,同时仍然执行相同的操作。 Visual C ++中优化和未优化构建之间最明显的区别是变量值在优化构建中尽可能长地保存在寄存器中,而没有优化它们总是存储在内存中。这不仅会影响代码速度,还会影响调试。由于这种优化,调试器无法在逐步执行代码时可靠地获取变量值。

其他优化

编译器应用了多个其他优化,如/O Options (Optimize Code) MSDN docs中所述。有关各种优化技术的一般说明,请参阅Wikipedia Compiler Optimization article

答案 1 :(得分:16)

来自Paul Vick's博客:

  • 它会删除我们原本会发出的任何NOP指令以协助调试。当关闭优化(并打开调试信息)时,编译器将为没有任何实际IL关联但您可能想要设置断点的行发出NOP指令。像这样的最常见的例子是“If”语句的“End If” - 没有为End If发出实际的IL,所以我们不发出NOP,调试器不会让你设置断点在上面。启用优化会强制编译器不发出NOP。

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

  • 我们发出一个DebuggableAttribute,并将IsJITOptimizerDisabled设置为False。基本上,这允许运行时JIT优化代码的方式,包括重新排序和内联代码。这将产生更高效和更小的代码,但这意味着尝试调试代码可能非常具有挑战性(因为任何试过它的人都会告诉你)。 JIT优化的实际列表是我不知道的事情 - 也许像Chris Brumme这样的人会在某个时候讨论这个问题。 它的长短是因为优化开关能够进行优化,这可能会使设置断点和更难以踩踏代码。

答案 2 :(得分:2)

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

答案很长:不能准确预测不同类型优化的效果。有时优化快速代码实际上会产生比优化大小时更小的代码。如果你真的想要获得最后0.01%的性能(速度或大小),你必须对不同的选项组合进行基准测试。

此外,Visual Studio的最新版本提供了更高级优化的选项,例如链接时优化和配置文件引导优化。