项目愈来愈大,每次须要从新编译整个项目都是一件很浪费时间的事情。Research了一下,找到如下能够帮助提升速度的方法,总结一下。c++
tmpfs缓存
有人说在Windows下用了RAMDisk把一个项目编译时间从4.5小时减小到了5分钟,也许这个数字是有点夸张了,不过粗想一想,把文件放到内存上作编译应该是比在磁盘上快多了吧,尤为若是编译器须要生成不少临时文件的话。测试
这个作法的实现成本最低,在Linux中,直接mount一个tmpfs就能够了。并且对所编译的工程没有任何要求,也不用改动编译环境。ui
mount -t tmpfs tmpfs ~/build -o size=1G内存
用2.6.32.2的Linux Kernel来测试一下编译速度:资源
用物理磁盘:40分16秒开发
用tmpfs:39分56秒input
呃……没什么变化。看来编译慢很大程度上瓶颈并不在IO上面。但对于一个实际项目来讲,编译过程当中可能还会有打包等IO密集的操做,因此只要可能,用tmpfs是有益无害的。固然对于大项目来讲,你须要有足够的内存才能负担得起这个tmpfs的开销。编译器
make -jit
既然IO不是瓶颈,那CPU就应该是一个影响编译速度的重要因素了。
用make -j带一个参数,能够把项目在进行并行编译,好比在一台双核的机器上,彻底能够用make -j4,让make最多容许4个编译命令同时执行,这样能够更有效的利用CPU资源。
仍是用Kernel来测试:
用make: 40分16秒
用make -j4:23分16秒
用make -j8:22分59秒
由此看来,在多核CPU上,适当的进行并行编译仍是能够明显提升编译速度的。但并行的任务不宜太多,通常是以CPU的核心数目的两倍为宜。
不过这个方案不是彻底没有cost的,若是项目的Makefile不规范,没有正确的设置好依赖关系,并行编译的结果就是编译不能正常进行。若是依赖关系设置过于保守,则可能自己编译的可并行度就降低了,也不能取得最佳的效果。
ccache
ccache用于把编译的中间结果进行缓存,以便在再次编译的时候能够节省时间。这对于玩Kernel来讲实在是再好不过了,由于常常须要修改一些Kernel的代码,而后再从新编译,而这两次编译大部分东西可能都没有发生变化。对于平时开发项目来讲,也是同样。为何不是直接用make所支持的增量编译呢?仍是由于现实中,由于Makefile的不规范,极可能这种“聪明”的方案根本不能正常工做,只有每次make clean再make才行。
安装完ccache后,能够在/usr/local/bin下创建gcc,g++,c++,cc的symbolic link,链到/usr/bin/ccache上。总之确认系统在调用gcc等命令时会调用到ccache就能够了(一般状况下/usr/local /bin会在PATH中排在/usr/bin前面)。
继续测试:
用ccache的第一次编译(make -j4):23分38秒
用ccache的第二次编译(make -j4):8分48秒
用ccache的第三次编译(修改若干配置,make -j4):23分48秒
看来修改配置(我改了CPU类型...)对ccache的影响是很大的,由于基本头文件发生变化后,就致使全部缓存数据都无效了,必须重头来作。但若是只是修改一些.c文件的代码,ccache的效果仍是至关明显的。并且使用ccache对项目没有特别的依赖,布署成本很低,这在平常工做中很实用。
能够用ccache -s来查看cache的使用和命中状况:
cache directory /home/lifanxi/.ccachecache hit 7165cache miss 14283called for link 71not a C/C++ file 120no input file 3045files in cache 28566cache size 81.7