您通常是否将编译器设置为优化最大速度或最小代码大小?或者您手动配置单独的优化设置?为什么?

我注意到大多数时候人们倾向于将编译器优化设置保留为默认状态,这对于 Visual C++ 意味着最大速度。我一直认为默认设置更多地与基准测试中的外观有关,这些程序往往是完全适合 L2 缓存的小程序,而不是最适合整体性能的程序,因此我通常将其优化为最小尺寸。

有帮助吗?

解决方案

作为 Gentoo 用户,我在整个操作系统上尝试了相当多的优化,并且关于 Gentoo 论坛 关于它。一些 GCC 的好标志可以在 维基百科.

简而言之,优化尺寸在内存有限的旧 Pentium3 笔记本电脑上效果最佳,但在我的配备 Core2Duo 的主台式机上,-O2 总体上给出了更好的结果。

还有一个 小脚本 如果您对最优化的 x86(32 位)特定标志感兴趣。

如果您使用 gcc 并且确实想优化特定应用程序,请尝试 阿科维亚. 。它运行一组基准测试,然后使用编译标志的所有可能组合重新编译它们。网站上有一个使用霍夫曼编码的示例(越低越好):

A relative graph of fitnesses:

   Acovea Best-of-the-Best: **************************************                (2.55366)
     Acovea Common Options: *******************************************           (2.86788)
                       -O1: **********************************************        (3.0752)
                       -O2: ***********************************************       (3.12343)
                       -O3: ***********************************************       (3.1277)
           -O3 -ffast-math: **************************************************    (3.31539)
                       -Os: *************************************************     (3.30573)

(请注意,它发现 -Os 在此 Opteron 系统上最慢。)

其他提示

我更喜欢使用最小尺寸。内存可能很便宜, 缓存不是.

除了缓存局部性很重要这一事实(正如 On Freund 所说)之外,微软所做的另一件事是分析他们的应用程序并找出在启动的前几秒内执行的代码路径。之后,他们将这些数据反馈给编译器,并要求它将启动期间执行的部分放在一起。这会导致更快的启动时间。

我确实相信这种技术在 VS 中是公开可用的,但我不是 100% 确定。

对我来说,这取决于我使用的平台。对于某些嵌入式平台或当我在 Cell 处理器上工作时,您会受到一些限制,例如非常小的缓存或为代码提供的最小空间。

我使用 GCC 并倾向于将其保留在“-O2”上,这是“最安全”的优化级别,并且更注重速度而不是最小的大小。

我想说,除非您正在开发非常高性能的应用程序,否则它可能不会产生巨大的差异,在这种情况下,您可能应该针对您的特定用例对各种选项进行基准测试。

Microsoft 发布的所有 C/C++ 软件都针对大小进行了优化。经过基准测试后,他们发现它实际上提供了更好的速度(由于缓存局部性)。

优化有很多种类型,最大速度与小代码只是其中之一。在这种情况下,我会选择最大速度,因为可执行文件会更大一些。另一方面,您可以针对特定类型的处理器优化您的应用程序。在某些情况下,这是一个好主意(如果您打算仅在您的工作站上运行该程序),但在这种情况下,该程序可能无法在其他体系结构上运行(例如:您将程序编译为在 Pentium 4 机器上运行 -> 它可能无法在 Pentium 3 机器上运行)。

构建两者,配置文件,选择哪个在特定项目和硬件上效果更好。

对于性能关键的代码,也就是说 - 否则选择任何一个并且不用打扰。

我们总是使用最大化来获得最佳速度,但是,我用 C++ 编写的所有代码都在某种程度上与生物信息学算法相关,并且速度至关重要,而代码大小相对较小。

现在内存很便宜:) 因此,除非您使用嵌入式系统,否则将编译器设置设置为最大速度是有意义的。当然答案要看具体情况。

这取决于您的程序的应用。当对应用程序进行编程以控制快速工业过程时,优化速度是有意义的。当编写只需要对用户输入做出反应的应用程序时,优化大小可能是有意义的。也就是说,如果您担心可执行文件的大小。

像这样调整编译器设置是一种优化。根据“过早的优化是万恶之源”的原则,在程序接近其最终交付状态并且我发现它不够快之前,我不会打扰它 - 即。几乎从不。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top