当前位置:  开发笔记 > 编程语言 > 正文

GCC /进行构建时间优化

如何解决《GCC/进行构建时间优化》经验,为你挑选了2个好方法。

我们有使用gcc和make文件的项目.项目还包含一个大的子项目(SDK)和许多使用该SDK和一些共享框架的相对较小的子项目.

我们使用预编译的头文件,但这有助于重新编译更快.

是否有任何已知的技术和工具可以帮助构建时优化?或者您可能知道有关此主题或相关主题的文章/资源?



1> David Rodríg..:

您可以从两个方面解决问题:重构代码以降低编译器看到的复杂性,或加快编译器的执行速度.

在不触及代码的情况下,您可以为其添加更多编译功能.使用ccache避免重新编译已编译的文件和distcc以在更多计算机之间分配构建时间.使用make -j,其中N是核心数量+ 1如果在本地编译,或者更大数量用于分布式构建.该标志将并行运行多个编译器.

重构代码.更喜欢前向声明包括(简单).尽可能地去耦以避免依赖(使用PIMPL习语).

模板实例化很昂贵,它们在每个使用它们的编译单元中重新编译.如果您可以重构模板以转发声明它们,然后仅在一个编译单元中实例化它们.



2> Nathan Fellm..:

我能想到的最好make-j选择就是选择.这告诉我们make要并行运行尽可能多的作业:

make -j

如果要将并发作业数限制为n,可以使用:

make -j ñ


确保依赖项是正确的,因此make不会运行它不需要的作业.


另一件需要考虑的事情是gcc-O交换机一起进行的优化.您可以指定各种级别的优化.优化越高,编译和链接时间越长.我使用的项目运行需要2分钟才能完成-O3,并且需要半分钟-O1.你应该确保你没有超出你需要的优化.您可以在不进行优化的情况下构建开发构建并优化部署构建.


使用调试信息(gcc -g)进行编译可能会增加可执行文件的大小,并可能影响您的构建时间.如果您不需要它,请尝试将其删除,看它是否会影响您.


链接类型(静态与动态)应该有所不同.据我所知,静态链接需要更长时间(虽然我可能在这里错了).您应该看看这是否会影响您的构建.


如果你的makefile通过调用make来递归,你将无法获得-j的可扩展性,因为只有顶层make将使用-j arg,你应该使用$(MAKE),因为它将使用相同的-j调用submakes你将有更好的机会让所有工作都在运行.
推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有