c++ - -fno-inline 和编译时间

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

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

我没有发现 -fno-inline 对编译性能的影响。 对此有什么解释吗?
一些背景:

  • 我非常广泛地使用 MACROSes(用于记录目的)
  • 有一个从旧代码继承的全局异常 try/catch block (需要重做这一 block )
  • 里面很少有try/catch block ,主要是捕捉stof/stoi的异常

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

最佳答案

I'm working on big project most files are longer than 7000 lines.

有点大。您可能(我不确定)通过避免大于 5KLOC 的文件(通过将大于 8KLOC 的大型 C++ 文件拆分为多个文件)以及通过并行编译多个翻译来赢得一些编译时间同时单位(使用 make -j ninja )。这需要一些重构工作。另一方面,对于真正的 C++,文件不要太小(因为像 <vector> 这样的标准容器头文件可能包含数千行;您也可以考虑将 having 视为预编译头文件)。实际上,每个 C++ 源文件 3KLOC 到 7KLOC 是一个很好的权衡。

使用 -ftime-report optiong++获得每个编译阶段(或通过)的详细时间。您可能需要了解 GCC 的内部结构才能破译获得的表。

I didn't find anything about -fno-inline impact on compilation performance. Is there any explanation to this ?

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”

关于c++ - -fno-inline 和编译时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52981361/

相关文章:

c++ - 这个创建元组的习语有名字吗?

c++ - 仿函数/函数对象的 is_function 类型特征

c++ - 用 C++ 打印(使用真实打印机)的最简单方法?

c++ - 原位删除元素的最佳方法

c++ - 如何从 Arch Linux 构建基本 64 位 Amazon Linux?

c++ - 排序 vector 时运算符重载的编译错误

c++ - 依赖非类型模板参数和可变参数模板

c++ - 为什么我们需要 C++ 中的虚函数?

c++ - LLVM:即时编译的简单示例

c++ - boost 程序选项中的默认和隐式参数