C++代碼一直以其運行時的高性能高調面對世人, 可是提及編譯速度,卻只有低調的份了。好比我如今工做的源代碼,哪怕使用Incredibuild調動近百臺機子,一個完整的build也須要四個小時,恐怖!!!雖然平時開發通常不須要在本地作完整的build,但編譯幾個相關的工程就夠你等上好一段時間的了(老外管這個叫monkey around,至關形象)。想一想若干年在一臺單核2.8GHZ上工做時的場景 - 面前放本書,一點build按鈕,就低頭讀一會書~~~往事不堪回首。html
能夠想象,若是不加以重視,編譯速度極有可能會成爲開發過程當中的一個瓶頸。那麼,爲何C++它就編譯的這麼慢呢?apache
我想最重要的一個緣由應該是C++基本的"頭文件-源文件"的編譯模型:網絡
這裏,問題在於無數頭文件的重複load與解析,以及密集的磁盤操做。框架
下面從各個角度給出一些加快編譯速度的作法,主要仍是針對上面提出的這個關鍵問題。分佈式
1、代碼角度模塊化
以頭文件爲例,不要把兩個不相關的類,或者沒什麼聯繫的宏定義放到一個頭文件裏。內容要儘可能單一,從而不會使包含他們的文件包含了不須要的內容。記得咱們曾經作過這麼一個事,把代碼中最"hot"的那些頭文件找出來,而後分紅多個獨立的小文件,效果至關可觀。svn
其實咱們去年作過的refactoring,把衆多DLL分離成UI與Core兩個部分,也是有着相同的效果的 - 提升開發效率。函數
2、綜合技巧 性能
3、編譯資源 ui
要提升速度,要麼減小任務,要麼加派人手,前面兩個方面講得都是減小任務,而事實上,在提升編譯速度這塊,加派人手仍是有着很是重要的做用的。
假設你有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分鐘以內。
另外,這本書談了不少這方面的內容:大規模C++程序設計。