什么是“优化代码”选项确实在Visual Studio中吗?

问题描述 投票:70回答:3

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

编辑:如果你在Google上搜索,你可以找到this address,但是这并不是我真正期待的。我不知道真正的事情发生。例如,为什么环获得更短的时间,等等。

visual-studio optimization
3个回答
59
投票

如果没有优化编译器产生非常愚蠢的代码 - 每个命令是非常直接的方式编写,以便它预期的事情。调试构建具有默认禁用优化,因为如果没有优化产生的可执行以直接的方式将源代码相匹配。

保存在寄存器变量

一旦你打开的优化,编译器应用多种不同的技术,使代码的运行速度,同时还在做同样的事情。优化和非优化之间最明显的差别构建在Visual C ++是实际上只要变量值被保存在寄存器中尽可能在最优化的构建,而无需优化它们总是存储到存储器中。这不仅影响了代码的运行速度,但它也影响调试。由于这种优化的结果,因为你是单步调试代码调试器不能可靠地获得一个变量的值。

其它优化

存在由编译器应用,如在/O Options (Optimize Code) MSDN docs描述的多个其他优化。对于各种优化的一般描述技术看Wikipedia Compiler Optimization article


16
投票

Paul Vick's博客:

  • 它消除了我们原本发出协助调试任何NOP指令。当优化是关闭(和调试信息被打开),编译器会发出对于没有与它们相关的任何实际的IL但你可能想要把一个断点行NOP指令。大概是这样的最常见的例子是“结束如果”的“如果”语句 - 有一个结束如果发出任何实际的IL,所以我们不发出NOP调试器不会让你设置一个断点在上面。在优化转动力编译器不会发出NOP指令。
  • 我们这样做所产生的IL的一个简单的基本程序块分析,以消除任何死代码块。也就是说,我们掰开每个方法进入由分支指令分离IL的块。这样做的块的相互关系进行快速分析,我们可以找出一些没有分支到他们的任何块。因此,我们可以计算出,将永远不会被执行,并且可以被省略,使得组件略小代码块。我们也做了一些小的分支优化,在这一点上,以及 - 例如,如果你转到另一个GoTo语句,我们只是优化第一页转到跳转到第二页转到的目标。
  • 我们发出与IsJITOptimizerDisabled一个DebuggableAttribute设置为False。基本上,这使得运行时JIT是怎么认为合适的,包括重新排序和内联代码来优化代码。这将产生更高效和更小的代码,但它意味着尝试调试的代码可以是非常具有挑战性的(如人谁的尝试,它会告诉你)。的JIT优化有什么实际的名单是什么,我不知道 - 也许有人像克里斯Brumme将在这方面的一些点插入内容。长期和短期的它是优化开关使优化可能使设置断点和单步执行代码更难。

2
投票

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

长的答案:不同的优化的效果是无法精确预测。有时,优化快速的代码将实际产生的大小优化时小码。如果你真的想要得到的性能(speedwise或sizewise)的最后0.01%,你要选择的基准不同组合。

此外,近期的Visual Studio版本具有更高级的优化,如链接时优化和档案导引优化选项。

© www.soinside.com 2019 - 2024. All rights reserved.