多源文件可执行文件比单个源文件可执行文件慢

que*_*ons 8 c++ optimization gcc

我有一个包含所有类定义和函数的源文件.

为了更好地组织,我将类声明(.h)和实现(.cpp)移动到单独的文件中.

但是当我编译它们时,它导致比我从单个源可执行文件获得的可执行文件更慢.对于相同的输入,它大约慢20-30秒.我改变任何代码.

为什么会这样?我怎样才能让它再次变快?

更新:单个源可执行文件在40秒内完成,而多个源可执行文件需要60个.我指的是运行时而不是编译.

Evg*_*uev 10

我认为,当编译为单个文件时,您的程序运行得更快,因为在这种情况下,编译器需要更多信息来优化代码.例如,它可以自动内联某些函数,这在单独编译时是不可能的.

为了更快地再次让,你可以尝试启用链接时优化器(或整个程序优化器)使用此选项:-flto.


如果-flto选项不可用(并且仅从gcc 4.6开始可用)或者由于某种原因您不想使用它,则至少有2个选项:

  1. 如果仅拆分项目for better organization,则可以为此文件创建单个源文件(如all.cxx)和#include所有源文件(所有其他*.cxx文件).然后,您只需要构建它all.cxx,并且所有编译器优化都可以再次使用.或者,如果您将其拆分以进行编译增量,则可以准备2个构建选项:增量构建和统一构建.第一个构建所有单独的源,第二个仅构建all.cxx.在这里查看更多相关信息.
  2. 您可以找到在拆分项目后牺牲性能的功能,并将它们移动到编译单元(使用它们)或头文件.为此,请从分析开始(请参阅" 我可以使用什么来分析Linux中的C++代码? ").进一步调查该计划的部分内容,这对计划的绩效产生重大影响; 这里有两个选项:再次使用分析器来比较增量和统一构建的结果(但这次你需要一个采样分析器,比如oprofile,而像仪器分析器,像gprof,很可能,对于这个任务太重了); 或者应用'实验'策略,如gbulmer所述.

  • @questions,是的,gcc可以做整个程序优化并打开它,使用`-flto`选项.gcc和g ++只是同一编译器的两个不同名称,相应地用于c或c ++. (3认同)

Tho*_*mas 5

这可能与链接时间优化有关.当您的所有代码都在单个源文件中时,编译器会更多地了解您的代码所执行的操作,以便执行更多优化.其中一个优化是内联:如果编译器在编译时知道它的实现,编译器只能内联函数!

这些优化也可以在链接时(而不是编译时)通过将-flto标志传递给gcc来完成,包括编译和链接阶段(参见此处).