【发布时间】:2011-03-03 11:38:23
【问题描述】:
从previous question 开始,我一直在我的发布版本中使用优化器设置,以了解使用编译器优化可以带来哪些好处。到目前为止,我一直在使用 /Ob1(仅在显式给出 inline 的情况下使用 inline)和 /Oi(启用内部函数)。我尝试将其更改为包括 /Ot(支持快速代码)、/Oy(省略帧指针)和 /Ob2(内联任何合适的),令我惊讶的是,一个需要 2 小时 58 分钟的回归套件现在需要 3 小时 16 分钟。我的第一个假设是我自己的内联比编译器更具侵略性,但是从 /Ob2 回到 /Ob1 只会将事情改进到 3h12m。我仍在运行更多测试,但似乎在某些情况下 /Ot (喜欢快速代码)实际上会减慢速度。该软件是多线程和计算密集型的(表面建模、操作和可视化),并且已经根据分析器结果进行了大量手动优化。该程序还处理大量数据,并经常使用#pragma pack(4)。
所以问题是这样的。对于手动优化的程序,VS2008 中的编译器优化是否弊大于利?换句话说,是否存在编译器优化会降低性能的已知记录场景? (n.b. 分析编译器优化的代码很痛苦,因此迄今为止已经对未优化的代码进行了分析。
编辑根据 Cody Gray 和其他人的建议,我已将 /O2 添加到优化设置中并重新执行了我的测试套件。这导致运行时间为 3h01,与最低限度优化的运行相当。鉴于(略微过时)MSDN guide lines on optimization 和来自 GOZ 的帖子,我将检查 /O1 以查看在我的情况下是否更小实际上更快。请注意,当前的 EXE 文件约为 ~11mb。我还将尝试一起构建 VS2010,看看效果如何。
Edit2 使用 /O1,运行时间为 3h00,11mb exe 小 62k。请注意,这篇文章和之前链接的文章背后的原因是检查打开编译器优化的好处是否超过了分析和调试方面的缺点。在这个特定的例子中,它们似乎没有,尽管我承认我很惊讶没有尝试过的组合增加任何好处并且明显降低了性能。 FWIW,根据previous thread,我倾向于在设计时进行大部分优化,并主要使用分析器来检查设计假设,我认为我会坚持使用这种方法。我将在 VS2010 上进行最后一次启用,并启用整个程序优化并保留它。
感谢所有反馈!
【问题讨论】:
-
有一段时间没用过 VS,所以也许这应该很明显:除了你提到的 epxlicit 优化之外,你编译的优化级别是什么? /O0?这当然是不行的……
-
虽然分析优化代码可能会很痛苦,但我不确定您是否要禁用优化以便手动分析和优化...不过这可能为时已晚。一般来说,优化器被设计为在常见的习语上工作得最好,你将从那里的优化器中获得最大的改进。然后,您可以集中精力分析/优化可以手动帮助编译器优化的热点
-
@Konrad,在 IDE 中优化设置为自定义,查看命令行选项,我没有设置优化级别,例如/Ob1 /Oi /Ot 是列出的唯一 optimizatopn 开关,当然没有 /O0 或 /Od。
-
Release 版本的默认设置已经将优化提升到了最大值。与翻转
/O2相比,您几乎无法从应用中挤出更好的性能。我很高兴看到 that 的基准,而不是您的自定义优化设置。 -
@Cody,现在试试。大约 3 小时后立即回复您; )
标签: c++ visual-studio-2008 optimization