【问题标题】:Optimized Execution Time优化的执行时间
【发布时间】:2017-11-22 16:55:53
【问题描述】:

由于学校作业,我必须将 C++ 代码转换为程序集 (ARMv8)。然后我必须使用 GCC 的 -O0、-O1、-O2、-O3 和 -Os 优化来编译 C++ 代码,记下时间并与我的汇编代码的执行时间进行比较。因为,我想我知道 -O3 必须比 -O1 和 -O2 快。但是,我知道-O2 是最快的,然后是-O1、-O3、-Os、-O0。这很平常吗? (计算时间约为 30 秒)。

【问题讨论】:

  • 我应该补充一点,虽然我标记的问题没有具体询问 -O2,但它已由那里接受的答案回答。
  • 您的问题标题是指编译时间,但您的问题文本似乎更关心执行时间,这不是一回事。
  • 是的,你是对的。我改变了它。谢谢。

标签: c++ gcc optimization compilation


【解决方案1】:

请注意,GCC 还有许多其他 optimization flags

不能保证-O3 提供的代码比-O2 更快;编译器可以应用更多的优化通道,但它们都是启发式的并且可能不成功(甚至会稍微减慢您的特定代码)。因此,-O3 给出的代码确实比-O2 稍慢(在某些特定输入源代码上)。

您可以尝试更新版本的 GCC(2017 年 11 月的最新版本是 GCC 7,GCC 8 将在几个月后发布)。您也可以尝试一些better -march=-mtune= 选项。

最后,使用您的GCC plugin,您可以添加自己的优化通道,或更改应用优化通道的顺序(和集合)(GCC 中有数百种不同的优化通道)。但是你需要做很多工作(可能一两年)才能扩展 GCC。

您可以调整优化参数,一些项目 (MILEPOST) 甚至使用机器学习技术来改进它们。

另请参阅我的(旧)GCC MELT documentation 上的幻灯片和参考资料。

【讨论】:

    【解决方案2】:

    是的,这很正常。以 -Ox 优化为指导方针。平均而言,它们产生的优化是广告,但很大程度上取决于编写代码的风格、内存布局以及编译器本身。 有时,在获得最佳代码之前,您需要多次尝试并失败。 -O2 在大多数情况下确实提供了最佳优化。

    【讨论】:

    • 谢谢!我设法只通过了 -O0,我的汇编代码在 57 秒内运行,-O1-3 在大约 33 秒内运行。有那么好吗?
    • 是的,就是这么好,而且为了进一步优化,你可能需要花费大量的时间和精力。与 C 代码相比,C++ 代码通常更难优化。如果可以,您可以尝试通过更改堆栈和堆的大小来进行内存优化。有时,它会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多