我一直试图通过MSDN pages阅读各种优化标记。
我们目前将大多数项目设置为/O2
,以优化"最大化速度"。
我的困惑是这究竟是什么意思。关于/O2
标志,下列哪一项陈述更接近真实?
我提出我们应该使用/Ox
标志的论点,但那时候我认为选项2是真的。
我基本上被告知"我们不会从/O2
更改为/Ox
,除非有人有确凿的证据证明我们需要这样做"。
所以我的问题是/O2
仍然执行内存优化吗?例如。返回值优化,复制省略等。从/O2
切换到/Ox
会得到什么?
答案 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>