-fno-inline和编译时间

时间:2018-10-25 04:27:03

标签: c++ g++ c++14

我正在做一个大型项目,大多数文件超过7000行。如果我使用-fno-inline选项,则编译时间将减少3倍。 实际数字:
w / o -fno-inline-340秒
w / -fno-inline〜115秒

我没有发现有关-fno-inline对编译性能的影响的任何信息。 对此有任何解释吗?
一些背景:

  • 我广泛使用MACROSes(用于记录目的)
  • 从旧代码继承了一个全局Exception try / catch块(需要重新编写)
  • 内部几乎没有try / catch块,主要用于捕获来自stof / stoi的异常

我使用和不使用(-pipe,-O0到-O3,-g / no -g,-ggdb / no ggdb)测试了编译时间。没有什么比-fno-inline更能缩短编译时间了。

1 个答案:

答案 0 :(得分:1)

  

我正在做一个大型项目,大多数文件超过7000行。

那有点大。通过避免大于5KLOC的文件(通过拆分多个大于8KLOC的大型C ++文件),以及并行编译 几种翻译,您可能(我不确定)会赢得一点编译时间单位(使用make -jninja)。这需要一些重构工作。另一方面,对于正版C ++,文件不要太小(因为诸如<vector>之类的标准容器头可能包含成千上万行;您可能还考虑将having作为预编译头)。实际上,每个C ++源文件3KLOC到7KLOC是一个很好的折衷方案。

使用-ftime-report optiong++获取每个编译阶段(或通过)的详细时间安排。您可能需要了解GCC的内部知识才能解密所获得的表。

  

我没有发现有关-fno-inline对编译性能的影响的任何信息。有什么解释吗?

Inline expansion在GCC内发生了几次 。它通常适用于某些GIMPLESSA内部表示。当然,内联可提高程序的运行时性能。禁用它可能会导致可执行文件失去50%的速度(甚至可能更多,因为内联成员函数(如getters and setters在C ++中已广泛使用,尤其是在标准container模板中)。

FWIW,我以前的GCC MELT网页(GCC MELT现在是一个沉寂的项目)有几个slides和参考资料,说明了GCC的内部结构,我现在(2018年10月)撰写>有关bismon的技术报告的草稿(目前由CHARIOT H2020项目资助); draft恰好有第1.3.2节,解释了一些有趣的GCC优化。

另请参阅CppCon 2017演讲:Matt Godbolt “What Has My Compiler Done for Me Lately? Unbolting the Compiler's Lid”