6

您通常将编译器设置为优化最大速度还是最小代码大小?还是您手动配置个别优化设置?为什么?

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

4

11 回答 11

6

作为一个 Gentoo 用户,我已经在整个操作系统上尝试了很多优化,并且在Gentoo 论坛上对此进行了无休止的讨论。可以在wiki中找到 GCC 的一些好的标志。

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

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

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

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 系统上是最慢的。)

于 2008-09-10T11:52:50.093 回答
2

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

于 2008-09-10T11:58:31.093 回答
2

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

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

于 2008-09-10T14:23:58.077 回答
1

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

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

我想说它可能不会有太大的不同,除非您正在开发一个非常高性能的应用程序,在这种情况下,您可能应该针对您的特定用例对各种选项进行基准测试。

于 2008-09-10T11:49:52.347 回答
1

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

于 2008-09-10T12:25:30.793 回答
1

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

于 2008-09-11T16:09:16.880 回答
1

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

对于性能关键代码,那就是 - 否则选择任何并且不要打扰。

于 2008-09-15T06:49:23.960 回答
0

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

于 2008-09-10T11:47:40.027 回答
0

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

于 2008-09-10T11:49:07.713 回答
0

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

于 2008-09-15T14:06:43.270 回答
0

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

于 2008-10-26T14:49:13.167 回答