【问题标题】:-fno-inline and compilation time-fno-inline 和编译时间
【发布时间】:2018-10-25 04:27:02
【问题描述】:

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

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

  • 我非常广泛地使用 MACROS(用于日志记录)
  • 从旧代码继承了一个全局异常 try / catch 块(需要返工这块)
  • 内部很少有 try/catch 块,主要是为了从 stof/stoi 捕获异常

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

【问题讨论】:

  • 它会减少编译时间,但也会降低运行时性能。
  • 为什么编译时间对你很重要?您是否在并行编译多个翻译单元(例如使用make -jninja)?你在哪个操作系统上编译?您的整个项目有多大(数百个文件中的数百万行?)?
  • 您可以将the -ftime-report option 传递给g++ 以更好地了解编译器将时间花在哪里。但是,禁用内联会显着降低可执行文件的运行时性能。
  • "大多数文件超过 7000 行"。逃跑,不要回头。
  • @BasileStarynkevitch 这实际上是 C++ 悲惨状态的一个很好的指标。也许模块会改变它。

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


【解决方案1】:

我正在处理大型项目,大多数文件都超过 7000 行。

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

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

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

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

FWIW,我的旧 GCC MELT 网页(GCC MELT 现在是一个死项目)有几个 slides 和解释 GCC 内部的参考资料,我现在(2018 年 10 月)正在写 草稿 em> 关于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”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多