使用/O2和/Ox编译代码,哪个更快(一般来说)?

4

这个问题MSDN似乎暗示/O2更快,但是如果你看看微软自己的SafeInt类,你会注意到它说:

1)编译优化代码 - /Ox 最好,/O2 也表现良好。有趣的是,/O1(为大小进行优化)不行。

如果差异真的只是如上面的问题所说的那样的/GF /Gy,那么/GF是无关紧要的(字符串池),而且/Gy(省略帧指针)在我看来不能真正对你有影响。

我有什么遗漏的吗?一般来说,/Ox更快吗?为什么或为什么不?


听起来写那条评论的人也被相应选项的名称所困惑。他们像我一样认为/Ox是更高级别的优化,因为文档称其为“完全优化”。 - Cody Gray
@CodyGray:我有这样的印象,他们实际上尝试过,但这听起来不像是猜测。 - user541686
他们可能这样做了。他们无法区分/Ox/O2之间的任何差异,只是选择鼓励使用/Ox,因为它听起来更好。他们确实说/O2“也表现良好”。 - Cody Gray
@CodyGray:我不明白你为什么会有这种印象,因为他们明确地说,/Ox 确实 更好...但如果你真的认为他们没有进行比较,那就算了。 - user541686
始终进行性能分析,并在多个CPU上运行。x86是一个复杂的系列,不总是清楚哪些编译器标志会生成最佳结果 - 这取决于您的源代码和目标CPU的混合。 - snemarch
1个回答

1

/Gy 不是省略帧指针,那个是 /Oy,它在至少启用了 /Ox/O1/O2 之一。

/Gy 是 COMDAT 生成(函数级链接),它倾向于减少工作集大小,但不应该真正影响代码质量。对于像 SafeInt 这样的模板和内联代码,可能根本没有可辨别的差异。

你链接的 MSDN 页面还说要使用 /O2 而不是 /Ox,所以我认为 "/Ox 通常更快" 的想法没有任何价值。


哦,糟糕,是COMDAT生成的问题。但不,这不是“我的想法”——这就是代码注释所说的。下载SafeInt3.hpp并自行查看;它们明确表示/Ox更快。我很困惑为什么会这样,或者是否普遍存在(如果不是,为什么)。 - user541686
1
@Mehrdad:抱歉,我只是将这个概括归因于你,而不是针对那个特定的文件提出的主张。无论如何,如果你再次阅读评论的措辞,它完全符合“/Ox”和“/O2”相等且优于任何其他选项集的说法。虽然这不是我选择的措辞,但在这种情况下说“/Ox最好”是正确的。只是碰巧“/O2”也是最好的。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接