Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ -fno内联和编译时间_C++_G++_C++14 - Fatal编程技术网

C++ -fno内联和编译时间

C++ -fno内联和编译时间,c++,g++,c++14,C++,G++,C++14,我正在做一个大项目,大多数文件都超过7000行。如果使用-fno内联选项,编译时间将减少3倍。 实际人数: w/o-fno内联-340秒 w/-fno直列~115秒 我没有发现任何关于-fno内联对编译性能的影响对此有什么解释吗? 一些背景: 我非常广泛地使用宏(用于日志记录) 有一个全局异常try/catch块继承自旧代码(需要重新编写此代码) 内部很少有try/catch块,主要用于捕获来自stof/stoi的异常 我使用和w/o(-pipe,-O0到-O3,-g/no-g,-ggdb/

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

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

  • 我非常广泛地使用宏(用于日志记录)
  • 有一个全局异常try/catch块继承自旧代码(需要重新编写此代码)
  • 内部很少有try/catch块,主要用于捕获来自stof/stoi的异常
我使用和w/o(-pipe,-O0到-O3,-g/no-g,-ggdb/no-ggdb)测试编译时间。没有什么比-fno内联更能缩短编译时间了


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

这有点大。您可能(我不确定)通过避免文件大于5kLoc(通过分割大的C++文件,大于8kLoc,在几个)中,并同时编译几个翻译单元(使用或)来赢得一点编译时间。这需要一些重构工作。另一方面,使用真正的C++,不要有太小的文件(因为标准的容器头像 < /Cord>)可能包含数千行,也可能考虑预编译头。实际上,3KLoC到7kLoc是每个C++源文件在实践中的一个很好的折衷。 使用to
g++
获取每个编译阶段(或过程)的详细时间。您可能需要了解GCC的内部结构,才能破译获得的表

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

在GCC中发生多次。它通常适用于某些或内部表示。当然,内联提高了程序的运行时性能。通过禁用它,您可以在执行程序中丢失50%的速度(甚至可能更多,因为内联成员函数如C++中广泛使用的,特别是在标准模板中)。 FWIW,我的旧网页(GCC MELT现在是一个死项目)有几个和解释GCC内部的参考资料,我现在(2018年10月)正在写一份技术报告草稿(现在由H2020项目资助);这正好有一节§1.3.2解释了一些有趣的GCC优化


另请参见CppCon 2017演讲:

它将减少编译时间,但也会降低运行时性能。为什么编译时间对您很重要?您是否并行编译多个翻译单元(例如使用
make-j
ninja
)?您在哪个操作系统上编译?您的整个项目有多大(数百个文件中有数百万行?)?您可以转到
g++
,以便更好地了解编译器在哪里花费时间。但是,禁用内联将显著降低可执行文件的运行时性能。“大多数文件都超过7000行”。跑开,不要回头看。@ BaselestalyKev痒这实际上是一个很好的指示器的悲伤状态的C++。也许模块会改变它。