Visual Studio 2013优化标志(/ O2 vs / Ox)

时间:2015-04-14 17:18:37

标签: c++ performance optimization visual-studio-2013 compiler-optimization

我一直试图通过MSDN pages阅读各种优化标记。

我们目前将大多数项目设置为/O2,以优化"最大化速度"。

我的困惑是这究竟是什么意思。关于/O2标志,下列哪一项陈述更接近真实?

  1. 针对速度和尺寸优化代码,但是如果存在争用首选优化速度
  2. 优化代码以提高速度,不要针对尺寸进行优化。
  3. 我提出我们应该使用/Ox标志的论点,但那时候我认为选项2是真的。

    我基本上被告知"我们不会从/O2更改为/Ox,除非有人有确凿的证据证明我们需要这样做"。

    所以我的问题是/O2仍然执行内存优化吗?例如。返回值优化,复制省略等。从/O2切换到/Ox会得到什么?

3 个答案:

答案 0 :(得分:7)

正如Arkanosis指出的那样,当从/ O2转到/ Ox时,你禁用/ Gs,/ GF,/ Gy 。问题是这些标志中的哪一个可能会提高执行速度?

/ Gs / Gs0 相同,而可能会对效果产生负面影响。请参阅以下MSDN上的说明。

  

为每个需要存储的函数调用激活堆栈探测   对于局部变量。这会对性能产生负面影响

/ GF 消除了重复的字符串(常量) - 称为字符串池。这将减少代码大小。较低的代码可能会产生较少数量的指令缓存未命中,但我怀疑这种效果在大多数代码中是可观察到的。

/ Gy 标记alows将各个函数打包到COMDAT结构中。这些可以用作解决方法,以避免由于同一符号的多个定义而导致的编译时错误。 MSDN文档声明这只会影响构建时间,但不会影响执行时间。他们通常建议使用它。

<强>结论:

/ Ox禁用/ Gs,/ GF,/ Gy。在某些情况下,与/ O2相比,这些选项会影响性能,几乎不会提高执行速度。当然,他们有好处,但与速度无关。

答案 1 :(得分:5)

  • /02/Og /Oi /Ot /Oy /Ob2 /Gs /GF /Gy
  • 相同
  • /Ox/Og /Oi /Ot /Oy /Ob2
  • 相同

因此,从/O2切换到/Ox意味着:

  • 没有/Gs(没有控件堆栈探测器)
  • 没有/GF(没有字符串池)
  • 没有/Gy(没有功能级链接)

答案 2 :(得分:0)

  

所以我的问题是/ O2仍然执行内存优化吗?

取决于内存优化的含义。

/ O1保证基于二进制大小优化代码。

  

在大多数情况下创建最小的代码。

/ O2主要旨在优化代码以加快速度。

  

在大多数情况下创建最快的代码。 (默认设置   发布版本)

时/ O2与/ O1正交(不限)的情况
  • 编译器会循环展开,
  • 代码重新排序
  • 代码内联

现在考虑/ Ox,它产生的代码有利于执行速度而不是更小的尺寸,因此/ Ox不包括/ Os(优惠小代码)通过指示编译器支持大小超过速度来最小化EXE和DLL的大小。 / p>