c++ - 多个源文件可执行文件比单个源文件可执行文件慢

标签 c++ optimization gcc

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

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

但是当我编译它们时,它生成的可执行文件比我从单一源可执行文件中获得的要慢。对于相同的输入,它大约慢 20-30 秒。我不会更改任何代码。

为什么会这样?我怎样才能让它更快呢?

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

最佳答案

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

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


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

  1. 如果您拆分项目只是为了更好的组织,您可以创建一个源文件(如all.cxx)和#include所有源文件(所有其他 *.cxx 文件)到此文件。然后你只需要构建这个all.cxx,所有的编译器优化都可以再次使用。或者,如果您还拆分它以进行增量编译,则可以准备 2 个构建选项:增量构建和统一构建。第一个构建所有单独的源,第二个构建 - 仅 all.cxx。查看有关此的更多信息 here .
  2. 您可以找到拆分项目后会降低性能的函数,并将它们移动到使用它们的编译单元或头文件中。为此,从分析开始(参见“What can I use to profile C++ code in Linux?”)。进一步调查程序中对程序性能有显着影响的部分;这里有 2 个选项:要么再次使用分析器来比较增量构建和统一构建的结果(但是这次你需要一个采样分析器,比如 oprofile,而一个检测分析器,比如 gprof,很可能对于这个任务来说太重了);或应用“实验性”策略,如 gbulmer 所述.

关于c++ - 多个源文件可执行文件比单个源文件可执行文件慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9742934/

相关文章:

c++ - 通过模板化运算符重载将 std::complex<T> 乘以 double

c++ - 掷硬币游戏 : Optimization problem

optimization - CPLEX 中的多容量背包

mysql - 这个查询有什么问题? EXPLAIN 对我来说很好

c++ - 强制 GCC 在寄存器中传递参数

c++ - GCC 5 ABI 更改

c++ - 带有 char* 构造函数的异常类

c++ - std::random_shuffle 未播种

c++ - 使用 istream 迭代器时解析失败

c++ - 为什么 `equal` 在 C++ 中适用于 const char*?