項目愈來愈大,每次須要從新編譯整個項目都是一件很浪費時間的事情。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