Visual studio 什么是;“优化代码”;选项在VisualStudio中真正起作用吗?

Visual studio 什么是;“优化代码”;选项在VisualStudio中真正起作用吗?,visual-studio,optimization,Visual Studio,Optimization,选项的名称说明了一些事情,但VisualStudio/compiler真正做了什么,以及真正的后果是什么 编辑:如果你搜索谷歌,你可以找到,但这不是我真正要找的。我想知道真实发生的事情。例如,为什么循环得到的时间更少等等。简单的答案是:使用-Ox,让编译器完成它的工作 答案很长:不同类型优化的效果不可能准确预测。有时优化快速代码实际上会产生比优化大小更小的代码。如果您真的想获得最后0.01%的性能(speedwise或sizewise),则必须对不同的选项组合进行基准测试 此外,Visual S

选项的名称说明了一些事情,但VisualStudio/compiler真正做了什么,以及真正的后果是什么


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

简单的答案是:使用-Ox,让编译器完成它的工作

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


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

如果不进行优化,编译器将生成非常愚蠢的代码-每个命令都以非常简单的方式编译,因此它可以完成预期的任务。默认情况下,调试版本禁用了优化,因为没有优化,生成的可执行文件将以直接的方式与源代码匹配

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

其他优化 编译器还应用了多个其他优化,如中所述。有关各种优化技术的一般说明,请参阅博客:

  • 它删除了任何NOP指令,否则我们会发出这些指令来帮助调试。当优化关闭(调试信息打开)时,编译器将为没有任何实际IL关联的行发出NOP指令,但您可能希望在这些行上设置断点。最常见的例子是“If”语句的“End If”-End If没有实际发出IL,因此我们不发出NOP调试器不允许您在其上设置断点。启用优化会强制编译器不发出NOP

  • 我们对生成的IL进行一个简单的基本块分析,以删除任何死代码块。也就是说,我们将每个方法分解为由分支指令分隔的IL块。通过快速分析这些块之间的相互关系,我们可以识别出没有分支的任何块。因此,我们可以找出不会发生错误的代码块我们也在这一点上做了一些小的分支优化——例如,如果你转到另一个GoTo语句,我们只优化第一个GoTo跳转到第二个GoTo的目标

  • 我们发出一个DebuggableAttribute,将IsJITOptimizerDisabled设置为False。基本上,这允许运行时JIT以其认为合适的方式优化代码,包括重新排序和内联代码。这将生成更高效、更小的代码,但这意味着调试代码可能非常困难(任何尝试过的人都会告诉你)JIT优化的实际清单是什么,我不知道——也许像Chris Brumme这样的人会在某个时候插话。 它的长短不一之处在于,optimization开关启用的优化可能会使设置断点和单步执行代码变得更加困难


你知道“优化代码”选项如何影响StackTrace类吗?在这个问题中,coxymla建议取消选中它,但我没有这样做,它仍然有效。你知道为什么吗?谢谢!@Carlo:内联时,你无法在堆栈跟踪中看到内联函数,因为它们在代码中根本不存在(这就是内联的全部内容)。