【问题标题】:How much should I optimize?我应该优化多少?
【发布时间】:2012-06-11 01:50:24
【问题描述】:

关于编译器 (GCC) 进行的优化,标准做法是什么?每个选项(-O、-O1、-O2、-O3、-Os、-s、-fexpensive-optimizations)有什么不同,我如何决定什么是最佳的?

【问题讨论】:

标签: gcc compiler-optimization compiler-flags


【解决方案1】:

通常 -O2 是一个很好的优化级别,可以先尝试。

但是,如果您希望获得尽可能好的结果,您最终会尝试许多优化级别,因为您无法事先判断哪个级别最适合您的应用。

还请注意,优化结果应随每个 CPU 不同而有所不同(在某些 CPU 上,针对大小进行优化实际上可能比针对速度进行优化产生更好的速度)。

仅供参考,以下是每个级别的简要说明(您可以在文档http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html 中找到完整说明):

-O(与 -O1 相同): 使用 -O,编译器会尝试减少代码大小和执行时间,而不执行任何需要大量编译时间的优化。

-O2:进一步优化。 GCC 执行几乎所有不涉及空间速度折衷的支持优化。与 -O 相比,此选项增加了编译时间和生成代码的性能。

-O3:进一步优化。 -O3 打开 -O2 指定的所有优化,同时打开 -finline-functions、-funswitch-loops、-fpredictive-commoning、-fgcse-after-reload、-ftree-vectorize、-ftree-partial-pre 和 - fipa-cp-克隆选项。

-Os:优化大小。 -Os 启用通常不会增加代码大小的所有 -O2 优化。它还执行旨在减少代码大小的进一步优化。

-Ofast:无视严格的标准合规性。 -Ofast 启用所有 -O3 优化。它还支持并非对所有符合标准的程序都有效的优化。它打开 -ffast-math 以及特定于 Fortran 的 -fno-protect-parens 和 -fstack-arrays。 如果您使用多个 -O 选项,无论有无级别编号,最后一个这样的选项是有效的。

【讨论】:

  • 谢谢,尤其是那个链接。很有帮助。
【解决方案2】:

Linux 内核的Makefile 提供-O2-Os。如果缺少进一步的细节,任何一个都是合适的。

-Os 针对小型存储进行了优化。由于如今 CPU 的速度明显快于主内存,因此即使在大型机器上优化小型存储也很有意义 - 等待从主内存填充缓存的任何时间都是浪费时间。因此,通过编译来最大限度地利用指令缓存以提高空间效率,也许执行时间也会得到改善。

-O2 运行所有“常规优化”,选择的优化将是安全的。 (我听说-O3 的一些优化并不总是安全的,但这可能是因为 Linux 内核运行时会受到一些通常应用程序不常见的约束。)

最好的答案当然是用多级优化编译您的软件; time 编译软件需要多长时间,以及软件通过代表性基准测试需要多长时间。测量它们都使用了多少内存。

然后选择编译速度、运行时速度和运行时内存使用的“最佳”组合。您可能想要最快的编译速度,或者您可能想要最快的运行时间,或者您可能会尝试从虚拟主机提供商处安装更少量的内存以节省资金。

直接选择-O2 而不进行任何测量可能是公平的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2010-10-20
    • 2011-11-05
    • 2012-10-15
    相关资源
    最近更新 更多