我有一个包含所有类定义和函数的源文件。
为了更好地组织,我将类声明 (.h) 和实现 (.cpp) 移到了单独的文件中。
但是当我编译它们时,它生成的可执行文件比我从单一源可执行文件中获得的要慢。对于相同的输入,它大约慢 20-30 秒。我不会更改任何代码。
为什么会这样?我怎样才能让它更快呢?
更新:单源可执行文件在 40 秒内完成,而多源可执行文件需要 60 秒。我指的是运行时而非编译。
最佳答案
我认为,当编译为单个文件时,您的程序运行得更快,因为在这种情况下,编译器拥有更多信息,需要优化代码。例如,它可以自动内联一些函数,这在单独编译的情况下是不可能的。
为了再次使其更快,您可以尝试使用此选项启用链接时间优化器(或整个程序优化器):-flto
。
如果 -flto
选项不可用(并且它仅从 gcc 4.6 开始可用)或者如果您出于某种原因不想使用它,您至少有 2 个选项:
- 如果您拆分项目只是
为了更好的组织
,您可以创建一个源文件(如all.cxx
)和#include
所有源文件(所有其他*.cxx
文件)到此文件。然后你只需要构建这个all.cxx
,所有的编译器优化都可以再次使用。或者,如果您还拆分它以进行增量编译,则可以准备 2 个构建选项:增量构建和统一构建。第一个构建所有单独的源,第二个构建 - 仅all.cxx
。查看有关此的更多信息 here . - 您可以找到拆分项目后会降低性能的函数,并将它们移动到使用它们的编译单元或头文件中。为此,从分析开始(参见“What can I use to profile C++ code in Linux?”)。进一步调查程序中对程序性能有显着影响的部分;这里有 2 个选项:要么再次使用分析器来比较增量构建和统一构建的结果(但是这次你需要一个采样分析器,比如 oprofile,而一个检测分析器,比如 gprof,很可能对于这个任务来说太重了);或应用“实验性”策略,如 gbulmer 所述.
关于c++ - 多个源文件可执行文件比单个源文件可执行文件慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9742934/