C++ 有没有办法优化g++;让它建造得更快?

C++ 有没有办法优化g++;让它建造得更快?,c++,g++,C++,G++,注意:这与生成的二进制代码的优化毫无关系。 我有一个超过120个源代码文件的项目。如果我将所有内容都放在一个巨大的cpp文件中,那么代码的编译时间要比运行标准MakefileBuild要短得多,标准MakefileBuild为每个cpp文件生成单独的g++进程。(我还注意到,在几乎为空或完全为空的cpp文件上运行g++也需要一些时间,因此在2个相对较小的cpp文件上运行g++比在1个包含这两个文件的代码的cpp文件上运行要长得多) 考虑到项目的规模,即使在非常快的硬件上,编译目前也需要很长的时间

注意:这与生成的二进制代码的优化毫无关系。

我有一个超过120个源代码文件的项目。如果我将所有内容都放在一个巨大的cpp文件中,那么代码的编译时间要比运行标准MakefileBuild要短得多,标准MakefileBuild为每个cpp文件生成单独的g++进程。(我还注意到,在几乎为空或完全为空的cpp文件上运行g++也需要一些时间,因此在2个相对较小的cpp文件上运行g++比在1个包含这两个文件的代码的cpp文件上运行要长得多)

考虑到项目的规模,即使在非常快的硬件上,编译目前也需要很长的时间。为了加快编译器生成二进制文件所需的时间,有什么可以做的吗?假设每个cpp文件都使用相同的选项加载了g++进程,我假设它对每个文件都做了相同的工作(它肯定需要从一些库中加载一些东西,等等,反复检查相同的东西等等)。难道没有什么东西可以让它跳过“对每个文件重复执行相同的任务”,从而更快地生成对象文件吗


编辑:项目是Qt应用程序,Makefile是使用
qmake

生成的。您尝试过并行编译吗?您可以添加-jN标志来生成,其中N是编译线程数(通常为1.5*cpu内核数)。

您可以尝试以下几点:

  • 确保没有在每个源文件中都包含每个头,尽量减少文件之间的耦合
  • 利用预编译头避免反复读取系统头
  • .cxx
    文件中包含相关的
    .C
    文件集,然后使用makefile编译这些文件集。这样做的效果是将所有源代码放在一个文件中,而不会使代码更难阅读

据我所知,最接近
gcc
缓存的地方是,您可以在调用
gcc
本身时使用它

ccache gcc [...]

但我建议您切换到建筑系统,例如
make
cmake
,因为这些软件能够跟踪不需要重新编译的依赖项和文件。

有几件事要做:

  • 如果可能,在头中向前声明,而不是包括头
  • 移除不需要的包括
  • 不要使用qmake和makefile,而是使用cmake和ninja(请参阅)
  • 获得更好的硬件(ssd磁盘、更多更快的内存、CPU等)
  • 在构建时生成更多作业

如果我将所有内容都放在一个巨大的cpp文件中,那么代码的编译时间要比运行标准MakefileBuild要短得多,标准MakefileBuild为每个cpp文件生成单独的g++进程


罪魁祸首很可能是坏硬盘。通过获得一个超快速的SSD磁盘,你会看到巨大的改进。

如果你只有120个CPP文件要编译,你认为多长时间“长”?试试预编译头。您注意到两个文件的编译时间比一个文件长——这可能是因为每个源文件都包含一个或多个头文件。因此,您不仅要编译源文件,还要编译其所有包含的内容。若在这两个源文件的包含列表中都有一些公共文件,那个么您可以执行双重作业。预编译头可以缓解此问题。速度减慢还有其他一些原因-例如,从磁盘读取一个文件比读取两个具有相同组合内容的文件要快。如果合并文件,则当仅更改一行时,必须重新生成整个项目。您是否使用CMake之类的make系统?如何管理构建?手写文件?克马克?汽车制造商?听起来你不是在利用并行构建或增量构建。。。请提供更多详细信息。最快、最便宜的修复方法是使用预编译头并删除任何不必要的包含。尽可能地转发声明。下一步是一个闪亮的SSD和一些RAM。我认为你把
gcc
make
混淆了。哦,是的,这在某种程度上是一个非常有用的建议,我知道这一点,它确实加快了速度,但它实际上更多的是运行多个g++实例,而不是使其执行更有效。我认为为了编译120多个文件,使用了make(或等效工具),因此对我来说,给出建议是正常的。向前声明类,而不是包含头文件。PIMPL习惯用法可能也能帮助减少依赖性。实际上,我的一台笔记本电脑上安装了SSD,但它的利用率似乎并不高,通常CPU的利用率为100%,而IO的利用率相当低。但另一方面,我有非常慢的CPU,大约1.2GHz