重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
可以想象,如果不加以重视,编译速度极有可能会成为开发过程中的一个瓶颈。那么,为什么C++它就编译的这么慢呢?
目前创新互联公司已为上1000家的企业提供了网站建设、域名、雅安服务器托管、网站托管、服务器租用、企业网站设计、双湖网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。我想最重要的一个原因应该是C++基本的"头文件-源文件"的编译模型:
这里,问题在于无数头文件的重复load与解析,以及密集的磁盘操作。
下面从各个角度给出一些加快编译速度的做法,主要还是针对上面提出的这个关键问题。
以头文件为例,不要把两个不相关的类,或者没什么联系的宏定义放到一个头文件里。内容要尽量单一,从而不会使包含他们的文件包含了不需要的内容。记得我们曾经做过这么一个事,把代码中最"hot"的那些头文件找出来,然后分成多个独立的小文件,效果相当可观。
其实我们去年做过的refactoring,把众多DLL分离成UI与Core两个部分,也是有着相同的效果的 - 提高开发效率。
要提高速度,要么减少任务,要么加派人手,前面两个方面讲得都是减少任务,而事实上,在提高编译速度这块,加派人手还是有着非常重要的作用的。
假设你有solution A和solution B,B依赖于A,所以必须在A之后Build B。其中A,B Build各需要1个小时,那么总共要2个小时。可是B一定要在A之后build吗?跳出这个思维框架,你就有了下述方案:
- 同时开始build A和B 。
- A的build成功,这里虽然B的build失败了,但都只是失败在最后的link上。
- 重新link B中的project。
这样,通过让A的build与B的编译并行,最后link一下B中的project,整个编译速度应该能够控制在1个小时15分钟之内。
Using CCache to speed up compilation
CCache is nothing more than a cache for your compiler. ccache is usually very easy to install. Here’s an example for Ubuntu systems:
sudo apt-get install ccache
ccache will cache previous compilations, detect when the same compilation is being done again, and reuse its cache instead of recompiling the source code again. This can speed up your compilation by many orders of magnitude, especially in those situations where your file timestamps change, and make is triggering a recompile.
To enable ccache, simply add ‘/usr/lib/ccache’ to the beginning of your PATH. This directory contains symlinks to ccache, and ccache is smart enough to look at the name of the calling executable to determine which real executable to run. I.e. there is a symlink from ‘/usr/lib/ccache/g++’ to just ‘ccache’, but it actually runs the equivalent of ‘ccache g++’.
Using colorgcc to colorize output
colorgcc is a colorizer for the output of GCC, and allows you to better interpret the compiler warnings/errors.
To enable both colorgcc and ccache, perform the following steps:
Install colorgcc on an Ubuntu system with
sudo apt-get install colorgcc
To enable colorgcc, perform the following steps:
cp /etc/colorgcc/colorgccrc $HOME/.colorgccrc
edit the $HOME/.colorgccrc file, search for the following lines:
g++: /usr/bin/g++
gcc: /usr/bin/gcc
c++: /usr/bin/g++
cc: /usr/bin/gcc
g77: /usr/bin/g77
f77: /usr/bin/g77
gcj: /usr/bin/gcj
and replace them with:
g++: ccache /usr/bin/g++
gcc: ccache /usr/bin/gcc
c++: ccache /usr/bin/g++
cc: ccache /usr/bin/gcc
g77: ccache /usr/bin/g77
f77: ccache /usr/bin/g77
gcj: ccache /usr/bin/gcj
create a $HOME/bin or $HOME/sbin directory, and create the following softlinks in it
ln -s /usr/bin/colorgcc c++
ln -s /usr/bin/colorgcc cc
ln -s /usr/bin/colorgcc g++
ln -s /usr/bin/colorgcc gcc
make sure that $HOME/bin or $HOME/sbin is the first directory in your $PATH, e.g.:
export PATH=$HOME/bin:$PATH
or:
export PATH=$HOME/sbin:$PATH
depending on where you stored the colorgcc softlinks, so that when cc/gcc/g++/c++ is invoked the freshly created softlinks get activated first and not the global /usr/bin/{cc,gcc,g++,c++}.