How to speed up g++ compile time (when using a lot

2019-01-29 23:47发布

This question is perhaps somehow odd, but how can I speed up g++ compile time? My C++ code heavily uses boost and templates. I already moved as much as possible out of the headers files and use the -j option, but still it takes quite a while to compile (and link).

Are there any tools out there which analyse my code and point out bottle-necks for the compiler? Or can one somehow profile the compiler running on my code? This would be really nice, because sometimes I have the impression, that I spent too much time staring at the compiler console log ...

11条回答
女痞
2楼-- · 2019-01-30 00:10

Here's what I've done to speed up builds under a very similar scenario that you describe (boost, templates, gcc)

  • build on local disk instead of a network file system like NFS
  • upgrade to a newer version of gcc
  • investigate distcc
  • faster build systems, especially more RAM
查看更多
Root(大扎)
3楼-- · 2019-01-30 00:12

I assume that we are talking about minutes to compile a file, i.e. precompiled headers or local disk issues aren't the problem.

Long compilation times with deep template code (boost etc.) is often rooted in the unfriendly asymptotic behavior of gcc when it comes to template instantiation, in particular when variadic templates are emulated with template default arguments.

Here's a document which names reduced compilation time as a motivation for variadic templates:

cpptruths had an article about how gcc-4.5 is much better in this behalf and how it does brilliantly with its variadic templates:

IIRC then BOOST has a way to limit the generation of template default parameters for the pseudo-variadics, I think 'g++ -DBOOST_MPL_LIMIT_LIST_SIZE=10' should work (the default is 20)

UPDATE: There is also a nice thread with general techniques to speed up compiling here on SO which might be useful:

UPDATE: This one is about the performance issues when compiling templates, the accepted answer recommends gcc-4.5 too, also clang is mentioned as a positive example:

查看更多
女痞
4楼-- · 2019-01-30 00:15

Compiling with g++ using multiple cores

Compiling with g++ using multiple cores

查看更多
甜甜的少女心
5楼-- · 2019-01-30 00:16

If there are a lot of files you can speed up compilation a lot by just having one .cpp file that #includes all the other .cpp files. This of course requires you to be more careful with macros and such that you already have defined per file as they will now be visible to other cpp files.

If there are many files this can reduce compile time a lot.

查看更多
我只想做你的唯一
6楼-- · 2019-01-30 00:16

Instantiate less templates and inline functions. Precompile as much as you can and just link it rather than compiling everything from scratch. Make sure you're using the latest version of GCC.

However, it's a simple fact that C++ is an incredibly complex language and compiling it takes quite some time.

查看更多
做自己的国王
7楼-- · 2019-01-30 00:17

On top of what everybody else added and what you're already doing (parallelized build, compiler options, etc), consider hiding templates in implementation classes, accessed through interfaces. That means that instead of having a class like:

// ClsWithNoTemplates.h file, included everywhere

class ClsWithTemplates
{
    ComplicatedTemplate<abc> member;
    // ...

public:
    void FunctionUsingYourMember();
};

you should have:

// 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
};

This changes your OOP design a bit, but it's for the good: including the definition of 'ClsWithNoTemplates' is now fast and you only (pre)compile the definition of 'ClsWithNoTemplates' once.

Aditionally, if you change the implementation code, any code that included ClsWithNoTemplates.h will probably not need to be redefined.

This change should dramatically increase your partial compilation time, and it will also help in the case where your ClsWithNoTemplates is a public interface exported from a library file: since the file is not changed when you only change the implementation, your dependent client code doesn't need to be recompiled at all.

查看更多
登录 后发表回答