【问题标题】:Tips to make builds faster加快构建速度的技巧
【发布时间】:2012-02-13 07:43:04
【问题描述】:

有什么方法可以让软件构建/编译更快?我们有一个使用 makefile 的构建树 c、c++,新构建需要将近 2 小时。我遇到了几个商业解决方案,例如 ElectricAccelerator、Sparkbuild,是否有任何开源等效方案?

【问题讨论】:

  • 两个小时!上次我看到这样的构建时间是在重载的 VAX 上。想必,这是一个非常大的工程。你在什么基础上构建它?是网络驱动器上的所有文件还是复制到本地?
  • @MartinJames 我已经看到一些 lisp、c、java 项目的构建时间为 6 小时。
  • @Shiplu - 很抱歉......我会发疯的。如果构建在 5.9 小时后出错,你如何阻止自己从高楼上跳下来?你对生成未解决的外部的开发人员做了什么 - 是不是很痛苦?
  • @Marin 构建由 hudson 每 12 小时完成一次。如果我们出现问题,SVN 日志会找到应该责备的开发人员
  • 只是好奇,您为什么反对商业解决方案?免责声明:我是 ElectricAccelerator 的架构师。

标签: build makefile gnu-make


【解决方案1】:

您没有指定配置软件,但我们发现 clearcase 存在问题。由于它如何逐个文件评估规则,因此仅打开文件可能是一个瓶颈。如果您“卡住”了 clearcase,甚至可以考虑进一步阅读。

因此,我们发现通过更改头文件的包含保护,您可以将构建时间缩短到 1/30(对我们来说确实如此)。

基本上,在您的头文件中,您在顶部有一个包含保护,例如:

#ifndef FOO_H
#define FOO_H
your code
#endif

然后在其他地方,你#include foo.h。对,好吧,我们发现由于类型文件的一些可怕的耦合,并且对于我们编译的每个 .c 文件,一些常见的头文件被包含数百次。由于 clearcase 设计缺陷,这意味着打开这些文件中的每一个数百次,结果却忽略了内容并再次关闭文件。

所以.. 不只是为 foo 使用 #include,而是使用守卫来有条件地包含 foo。通常这是不好的做法,也是可怕的维护噩梦(如果有人开始更换警卫)。

所以.. 在您的 .c 文件中,您最终会执行以下操作:

#include <stdio.h>
#ifndef FOO_H
#include "foo.h"
#endif
#ifndef FOO_H
#include "foo.h"
#endif
... rest of your code implementation

就像我说的...不好的做法,但是如果您使用 clearcase 并且它会咬您 3-4 次构建时间(就像我们所做的那样)...可能值得考虑(或者只是制作整个树的副本外透明箱)。或抛弃透明箱。或者在类型相互依赖方面做得更好。

我们能够“修复”一些最过度使用的包含,并显着缩短构建时间。

【讨论】:

    【解决方案2】:

    在 google 上搜索可能有助于获取开源软件列表。
    W.r.t 您的代码,您可以执行以下操作来减少构建时间:

    • 尽可能使用前向声明。
    • 使用命名空间声明代替命名空间指令
    • 确保没有不必要的包含。

    【讨论】:

    • 什么是包含声明
    • @shiplu.mokadd.im:更正了错字。谢谢。
    【解决方案3】:

    我们使用distmakeccachemakefile-generator 的组合来创建可并行化的makefile。 C/C++ 构建可以非常好地并行化;通常所有.o 文件都可以并行编译。

    Distmake 是 make 的分布式实现,基于 gnu make 并在 GPL 下发布。我维护它。它使您可以跨多个主机并行化。这要求所有主机都具有相同的文件系统视图,例如。 NFS,因此相同的命令可以在任何构建主机上运行。

    如果您有该选项,关闭优化往往会产生更快的构建。

    如果您已经使用并行构建架构,但它仍然很慢,您可能只需要研究它。用秒表观察它的进度,看看它的瓶颈在哪里。寻找您可能没想到的“长杆”。祝你好运。

    【讨论】:

      【解决方案4】:

      如果正确使用预编译头文件,可以大大减少构建时间。

      【讨论】:

        【解决方案5】:

        一种方法是简单地在更快的硬件上运行构建。我意识到这不是总是一个选项,但它仍然需要考虑。

        正如@Martin 所提到的,要升级的一些特定子系统包括尽可能快地使用磁盘,例如 SSD、添加更多 RAM、更快的 CPU(以及更多内核,如果您的编译器可以使用它们),以及确保正在构建的文件都是构建机器的本地文件(不在网络上)。

        您还应该为构建过程提供尽可能多的资源池,因此从构建机器中剥离所有与构建无关的进程和应用程序。这将减少任何资源争用。

        【讨论】:

        • 是的 - 快速 SSD 阵列、大量 RAM、将源代码复制到本地文件夹以进行构建。
        • 没错。消除构建机器上的瓶颈至关重要。感谢您添加要升级的特定项目。
        • .. 冲浪、bitTorrent 和游戏也运行得非常快,(在构建之间的短暂休息中:)
        • 我会说 bitTorrent 和冲浪速度更多取决于构建不应该依赖的网络速度,所以那些赢了看不到提升,而且大多数游戏更多地依赖于 GPU 性能,因此您可能不会看到这些游戏的速度提升很大,但是是的,操作系统会感觉 很多 拉链。
        • 好吧,我承认很难向一个有技术知识的经理证明构建服务器确实需要两个高端显卡和一个 28" LED 显示器:(
        【解决方案6】:

        在我们公司,我们有很多构建时间较长的产品,例如 3-6 小时。

        我们使用了两种技术。

        1. 通过-j 选项make 使用并行构建
        2. 将 RAM 挂载为磁盘。然后将所有文件移到那里并编译。但是你需要大量的内存。我们使用了 Amazon 的 ec2 实例。这是相当昂贵的。

        【讨论】:

        • '构建时间大约 3-6 小时' - 哎哟!我想我会找到一份新工作.. :)
        • @MartinJames 别担心,Hudson 为我做的。
        【解决方案7】:

        您可能想查看distccccache,当然还有-j make 选项。

        【讨论】: