由于学校作业,我必须将C ++代码转换为程序集(ARMv8)。然后我必须使用GCC< s -O0,-O1,-O2,-O3和-Os优化来编译C ++代码,记下时间并与汇编代码的执行时间进行比较。因为,我想我知道-O3必须比-O1和-O2快。但是,我得到-O2是最快的,然后是-O1,-O3,-Os,-O0。这是通常的吗? (计算时间约为30秒)。
答案 0 :(得分:2)
请注意,GCC有许多其他 optimization flags。
无法保证-O3
提供比-O2
更快的代码;编译器可以应用更多的优化传递,但它们都是启发式的,可能不成功(甚至可能会稍微减慢您的特定代码)。因此,-O3
提供的代码比-O2
略慢(在某些特定的输入源代码上)。
您可以尝试更新版本的GCC(最新版本 - 2017年11月 - GCC 7,GCC 8将在几个月后退出)。您还可以尝试一些better -march=
或-mtune=
选项。
最后,使用您的GCC plugin,您可以添加自己的优化传递,或更改应用优化传递的顺序(和集合)(有数百种不同的优化传递在海湾合作委员会)。但是你需要做很多工作(也许一两年)才能扩展GCC。
您可以调整优化参数,而某些项目(MILEPOST)甚至使用机器学习技术来改进它们。
另请参阅我(旧)GCC MELT documentation上的幻灯片和参考资料。
答案 1 :(得分:1)
是的,通常是这样。将-Ox优化作为指导线。平均而言,它们会产生广告优化,但很大程度上取决于编写代码的样式,内存布局以及编译器本身。 有时,在获得最佳代码之前,您需要多次尝试失败。 -O2确实在大多数情况下提供了最佳优化。