代码之家  ›  专栏  ›  技术社区  ›  Danvil

如何加快g++编译时间(使用大量模板时)

  •  61
  • Danvil  · 技术社区  · 14 年前

    11 回复  |  直到 14 年前
        1
  •  54
  •   strager    14 年前

    • 建立在RAM文件系统上。这在Linux上是微不足道的。您可能还希望在RAM文件系统上保留一个公共头文件的副本(预编译或实际的.h文件)。
    • Precompiled headers . 我每个(主要)库有一个(例如Boost、Qt、stdlib)。
    • Parallelize make . 这通常有助于个案的基础上,但我有 -j3
    • 使用 -O0 如果您没有测试执行速度或代码大小(并且您的计算机足够快,您不必太在意(可能很小的)性能影响)。
    • 每次保存时编译。有些人不喜欢这样,但它可以让你尽早看到错误,并且可以在后台完成,减少了你在完成写作和准备测试时必须等待的时间。
        2
  •  17
  •   Sam Miller    14 年前

    下面是我在您描述的非常类似的场景(boost、模板、gcc)下所做的加速构建的工作

    • 升级到gcc的更新版本
    • 调查 distcc
        3
  •  17
  •   Community Ian Goodfellow    7 年前

    我想我们是在谈论 编译一个文件,即预编译头或本地磁盘问题不是问题。

    使用深度模板代码(boost等)的长编译时间通常源于gcc在模板实例化时的不友好渐近行为,特别是当使用模板默认参数模拟可变模板时。

    以下是一个文档,它将缩短编译时间命名为可变模板的动机:

    cpptruths发表了一篇文章,介绍了gcc-4.5如何在这方面做得更好,以及它如何出色地使用可变模板:

    IIRC然后BOOST有一种方法来限制伪变量的模板默认参数的生成,我认为“g++-DBOOST\u MPL\u limit\u LIST\u SIZE=10”应该可以工作(默认值是20)

    更新:

    更新:

        4
  •  11
  •   viraptor    13 年前

    如果你要做大量的重新编译, ccache 可能会有帮助。它实际上并没有加快编译速度,但是如果您出于某种原因碰巧进行了无用的重新编译,它会给您一个缓存结果。这可能会给人一种处理错误问题的印象,但有时重建规则非常复杂,以至于在新的构建过程中,您实际上会得到相同的编译步骤。

    clang ,改用它。它通常比gcc快。

        5
  •  3
  •   utnapistim    14 年前

    // ClsWithNoTemplates.h file, included everywhere
    
    class ClsWithTemplates
    {
        ComplicatedTemplate<abc> member;
        // ...
    
    public:
        void FunctionUsingYourMember();
    };
    

    你应该有:

    // ClsWithNoTemplates.h file:
    
    class ClsWithTemplatesImplementation; // forward declaration
      // definition included in the ClsWithNoTemplates.cpp file
      // this class will have a ComplicatedTemplate<abc> member, but it is only 
      // included in your ClsWithNoTemplates definition file (that is only included once)
    
    
    class ClsWithNoTemplates
    {
         ClsWithTemplatesImplementation * impl; // no templates mentioned anywhere here
    public:
        void FunctionUsingYourMember(); // call impl->FunctionUsingYourMember() internally
    };
    

    这会稍微改变您的OOP设计,但这是有益的:包括“ClsWithNoTemplates”的定义现在是 快速的 并且只(预)编译一次“ClsWithNoTemplates”的定义。

        6
  •  3
  •   Community Ian Goodfellow    7 年前

    What techniques can be used to speed up C++ compilation times?

    它将防止编译器在每次需要执行某项操作时都遵循头文件和实现链。

        7
  •  2
  •   Zitrax dudico    14 年前

    如果有很多文件,只要有一个包含所有其他.cpp文件的.cpp文件,就可以大大加快编译速度。当然,这需要您更加小心地使用宏,这样您就已经定义了每个文件,因为它们现在将对其他cpp文件可见。

        8
  •  1
  •   Puppy    14 年前

    实例化更少的模板和内联函数。尽可能多地预编译并链接它,而不是从头开始编译。确保您使用的是最新版本的GCC。

        9
  •  1
  •   Chris Tonkinson    14 年前

    This paper 描述一种编译模板代码的方法,非常类似于“传统”的非模板对象文件。保存编译(&A);链接时间,每个模板实例化只有一行代码开销。

        10
  •  0
  •   John R. Strohm    14 年前

    全部 (b)将编译器加载到每个源文件的内存中。

    如果您有52个源(.cc)文件,其中每个文件#包含47个#包含(.h)文件,那么您将加载编译器52次,并将遍历2496个文件。根据文件中注释的密度,您可能会花费大量时间来吃掉无用的字符(在我见过的一个组织中,头文件的注释在66%到90%之间变化,只有10%-33%的文件是“有意义的”。要提高这些文件的可读性,最好的办法就是去掉最后的注释,只留下代码。)

    仔细看看你的课程是如何组织起来的。查看是否可以合并源文件,并简化#include文件的层次结构。

    几十年前,像IBM这样的公司就明白了这一点,他们会编写自己的编译器,这样编译器就可以得到一个要编译的文件列表,而不仅仅是一个文件,而且编译器只会被加载一次。