Linux程序編譯速度提升方法

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

相關文章
相關標籤/搜索