继从上一个问题 https://stackoverflow.com/questions/5165877/whole-program-optimization-failing-in-vc2008,我一直在我的发布版本中尝试优化器设置,以了解使用编译器优化可以带来哪些好处。到目前为止,我一直在使用 /Ob1 (仅在明确给出内联的情况下内联)和 /Oi (启用内部函数)。我尝试将其更改为包括 /Ot(支持快速代码)、/Oy(省略帧指针)和 /Ob2(内联任何合适的),令我惊讶的是,原来需要 2 小时 58 分钟的回归套件现在需要 3 小时 16 分钟。我的第一个假设是我自己的内联比编译器更积极,但从 /Ob2 回到 /Ob1 仅将事情改进到 3 小时 12 分钟。我仍在运行更多测试,但在某些情况下 /Ot(支持快速代码)实际上会减慢速度。该软件是多线程和计算密集型的(表面建模、操作和可视化),并且已经根据分析器结果进行了大量手动优化。该程序还处理大量数据,并且经常使用#pragma pack(4)。
所以问题是这样的。对于手动优化的程序,VS2008 中的编译器优化是否弊大于利?换句话说,是否存在编译器优化会降低性能的已知记录场景? (注意,分析编译器优化的代码是很痛苦的,因此迄今为止的分析都是在未优化的代码上完成的)。
Edit根据 Cody Gray 和其他人的建议,我已将 /O2 添加到优化设置中并重新执行我的测试套件。这导致运行时间为 3 小时 1 秒,与最低限度优化的运行时间相当。鉴于(稍微过时)MSDN 优化指南 http://msdn.microsoft.com/en-us/library/aa290055(v=vs.71).aspx并从 GOZ 发帖,我将检查 /O1 看看在我的情况下较小是否实际上更快。请注意,当前的 EXE 文件大约为 11mb。我还将尝试一起构建 VS2010,看看效果如何。
Edit2使用 /O1,运行时间为 3 小时,11mb 的 exe 缩小了 62k。请注意,这篇文章和上一篇链接文章背后的原因是检查打开编译器优化的好处是否超过了分析和调试方面的缺点。在这个特定的例子中,它们似乎并非如此,尽管我承认对尝试的所有组合都没有增加任何好处并且性能明显下降感到惊讶。 FWIW,根据这个上一个线程 https://stackoverflow.com/questions/385506/when-is-optimisation-premature/385825#385825,我倾向于在设计时进行大部分优化,并主要使用分析器来检查设计假设,我认为我会坚持使用这种方法。我将在启用整个程序优化的情况下对 VS2010 进行最后一次尝试,然后就到此为止。
感谢您的所有反馈!
The 文档 http://msdn.microsoft.com/en-us/library/f9534wye.aspx for /Ot
states:
如果你使用/Os
or /Ot
,那么您还必须指定/Og
来优化代码。
所以你可能想总是通过/Og
with /Ot
在你的测试中。
也就是说,/Ot
以牺牲程序大小为代价来支持快速代码,并且可以生成非常大的二进制文件,尤其是在大量内联的情况下。大型二进制文件很难利用处理器缓存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)