【问题标题】:How do you normally set up your compiler's optimization settings?您通常如何设置编译器的优化设置?
【发布时间】:2010-09-08 09:40:44
【问题描述】:

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

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

【问题讨论】:

    标签: c++ c optimization compiler-optimization


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        我想说,除非您正在开发一个非常高性能的应用程序,否则您可能应该针对您的特定用例对各种选项进行基准测试。

        【讨论】:

          【解决方案4】:

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

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

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

          如果您使用 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 系统上最慢的。)

          【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 除非您处于内存紧急状态,否则优化大小通常会给您带来更差的性能
          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

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

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

                【讨论】:

                  【解决方案10】:

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

                  【讨论】:

                    【解决方案11】:

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

                    【讨论】:

                      猜你喜欢
                      • 2015-06-05
                      • 2022-12-10
                      • 2013-06-06
                      • 2011-08-17
                      • 1970-01-01
                      • 2016-10-14
                      • 2020-08-17
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多