您使用了哪些策略来改进大型项目的构建时间? 我曾经在一个C++项目上工作过一个半小时,以便进行完全的重建。小的编辑、构建和测试周期大约需要5到10分钟。这是一场徒劳的噩梦

您使用了哪些策略来改进大型项目的构建时间? 我曾经在一个C++项目上工作过一个半小时,以便进行完全的重建。小的编辑、构建和测试周期大约需要5到10分钟。这是一场徒劳的噩梦,c++,compiler-construction,build-process,build-automation,C++,Compiler Construction,Build Process,Build Automation,您必须处理的最糟糕的构建时间是什么 您使用了哪些策略来改进大型项目的构建时间 更新: 你认为使用的语言在多大程度上是造成这个问题的原因?我认为C++容易对大型项目产生巨大依赖性,这通常意味着即使对源代码进行简单的更改也会导致大规模的重建。您认为哪种语言最适合处理大型项目依赖性问题 远期申报 pimpl习语 预编译头 并行编译(例如,Visual Studio的MPCL外接程序) 分布式编译(例如,Visual Studio的增量编译) 增量构建 在几个“项目”中拆分构建,因此如果不需要,就不要编

您必须处理的最糟糕的构建时间是什么

您使用了哪些策略来改进大型项目的构建时间

更新:

你认为使用的语言在多大程度上是造成这个问题的原因?我认为C++容易对大型项目产生巨大依赖性,这通常意味着即使对源代码进行简单的更改也会导致大规模的重建。您认为哪种语言最适合处理大型项目依赖性问题

  • 远期申报
  • pimpl习语
  • 预编译头
  • 并行编译(例如,Visual Studio的MPCL外接程序)
  • 分布式编译(例如,Visual Studio的增量编译)
  • 增量构建
  • 在几个“项目”中拆分构建,因此如果不需要,就不要编译所有代码
  • [稍后编辑]
    8.购买速度更快的机器。

    我的策略很简单——我不做大型项目。现代计算的全部主攻方向是从庞大的、单一的,转向小型的、组件化的。因此,当我在项目中工作时,我会将东西分解成库和其他组件,这些组件可以独立构建和测试,并且相互之间的依赖性最小。这种环境中的“完整构建”实际上从未发生过,因此没有问题

  • 摆弄编译器优化标志
  • 使用选项-j4进行并行编译(多核或单核)
  • 如果您正在使用clearmake,请使用winking
  • 在极端情况下,我们可以去掉调试标志
  • 使用一些功能强大的服务器

  • 强大的编译机器和并行编译器。我们还确保尽可能少地需要完整构建。我们不会为了加快编译速度而修改代码


    效率和正确性比编译速度更重要。

    在Visual Studio中,您可以设置一次要编译的项目数。其默认值为2,增加该值将减少一些时间


    如果您不想弄乱代码,这将很有帮助。

    以下是我们在Linux下为开发所做的工作列表:

    • 正如Warrior所指出的,使用并行构建(make-jN)
    • 我们使用分布式构建(目前非常容易设置),在给定的时间内,我们可以使用十个或多个处理器。这还有一个优点,就是将构建提供给功能最强大、负载最轻的机器
    • 我们使用ccache,这样当您进行makeclean时,您就不必重新编译没有更改的源代码,它是从缓存中复制的
    • 还要注意的是,调试版本通常编译得更快,因为编译器不必进行优化
  • 多核编译。速度非常快,在I7上编译8个内核
  • 增量链接
  • 外部常数
  • 删除C++类的内联方法。 最后两次让我们的连接时间从大约12分钟缩短到了1-2分钟。请注意,只有当事物具有巨大的可视性(即“随处可见”)并且存在许多不同的常量和类时,才需要这样做


    干杯

    我们曾经尝试过创建代理类


    这些实际上是只包含公共接口的类的简化版本,减少了需要在头文件中公开的内部依赖项的数量。然而,他们付出了沉重的代价,将每个类分散在几个文件上,这些文件在更改类接口时都需要更新。

    一个有时有用的技巧是将所有内容都包含在一个.cpp文件中。由于每个文件只处理一次包含,因此可以节省大量时间。(这样做的缺点是编译器无法并行化编译)

    您应该能够指定应并行编译多个.cpp文件(-j在linux上使用make,/MP在MSVC上使用-MSVC还可以选择并行编译多个项目。这些是单独的选项,没有理由不同时使用这两个选项)

    同样,分布式构建(例如,IncredBuild)可能有助于减轻单个系统的负担

    SSD磁盘应该是一个大的胜利,虽然我自己没有测试过(但是C++构建涉及大量的文件,这很快就会成为瓶颈)。 如果小心使用,预编译头也会有所帮助。(如果必须经常重新编译,它们也会伤害你)

    最后,尽量减少代码本身的依赖性是很重要的。使用pImpl习惯用法,使用前向声明,使代码尽可能模块化。在某些情况下,使用模板可以帮助您解耦类并最小化依赖关系。(当然,在其他情况下,模板会显著降低编译速度)

    但是是的,你是对的,这在很大程度上是一种语言。我不知道还有哪种语言会有如此严重的问题。大多数语言都有一个模块系统,允许它们消除头文件,这是一个巨大的因素。C有头文件,但它是一种非常简单的语言,编译时间仍然可以管理。C++是两个世界中最差的。一种庞大复杂的语言,一种可怕的原始构建机制,需要反复解析大量代码。

    Unity Builds

    难以置信的建筑

    指向实现的指针

    转发声明


    编译“完成的”部分的DeLJCT到DLL的

    < P> < /P> < P>在我所做的一般的大型C++项目中,这些构建的时间很慢,很难通过代码散布很多相互依存的关系(在大多数CPPS中使用的同样的文件,FAT接口,而不是瘦的文件)。在这些情况下,