由於工程的檔案的日益龐大和第3方庫(ace loki boost等等)的使用增多
我所工作的專案系統構建時間從最初的3分鐘變為現在的8分鐘
程式設計師的機器配置已經很不錯了,3。0 的主頻1g的記憶體,但是常常由於乙個小的修改導致5分鐘甚至更長的編譯時間來驗證效果。
按照《joel on software》的說法,其直接後果是可怕的:
程式設計師們在這8分鐘內無所事事,只有檢視網頁,或者qqmsn,打斷先前的思路從他們的上下文環境裡面脫離了出來,離開了「順勢工作時間」,等到他們編譯好了驗證再修改的時候,他們又得花不少的時間來回到剛才的思路
「順勢工作時間」大致意思就是說2個不連續的半小時的效果遠不如乙個連續沉浸的1小時的工作效果,如果乙個人不能連續沉浸的思考,那麼他就很可能陷入在不停的上下文環境切換和淺表思考當中。人的多執行緒處理和機器是一樣的環境的切換損耗不能夠不考慮。
所以,在當前機器配置已經沒有什麼提公升空間的情況下,我在專案組內部組織了一次整改活動,旨在降低編譯構建時間。
1。目標:將完全重新編譯時間從8分鐘降低到4分鐘以下。
關於include的原則最多,因為包含標頭檔案相當於將**複製到本檔案 來編譯,而標頭檔案又經常是用來被別人包含的,所以工程檔案多了,每個檔案都有include鏈(包含的檔案又include了其他檔案),該鏈條不會止步 於你工程,而會延伸到你所有使用的第3方庫裡面。
a.能夠去掉的include就去掉。
說明:1.**編寫過程中或多或少都有一些歷史遺留的不必要的標頭檔案包含在你的檔案裡面,找到他們並去掉之。
2.去掉include鏈裡面重複的include 。
b.能夠在cpp
裡面include的標頭檔案不要在標頭檔案裡面include。
說明:盡量去掉每個cpp會被串起來的標頭檔案膨脹的機會。
c.能夠用前向宣告的就不要include,標頭檔案裡面也是一樣
說明:在標頭檔案裡面用前向宣告然後儲存指標或者引用,在具體實現的cpp裡面再包含標頭檔案,雖然看起來和《c++ coding standards》「
make header files self-sufficient
」有些衝突(前兩天另外cppblog一位朋友講過
http://www.cppblog.com/flyingxu/archive/2006/06/23/8908.html)但是在一些核心的.h(被很多類include的)裡面作改造工作,還是能夠收到很大的降低編譯時間效果,而付出的代價就是原來只需要包含該標頭檔案就可以編譯成功的cpp需要額外包含一些標頭檔案。
舉個例子: foo類標頭檔案使用了前向申明儲存了a類和b類的指標或者引用為成員變數,在foo類的cpp裡面才包含a和b的標頭檔案,而當c類需要使用foo類時候包含foo類的標頭檔案,但是操作中又需要呼叫a的成員函式,c不同時包含a的標頭檔案的花就會出現編譯失敗。
雖 然表面上是讓**更加複雜了,但是除卻帶來降低編譯時間的好處之外,**也在強迫你進行解耦合,如果說你cpp裡面需要包含的標頭檔案越多,說明你這個類需 要知道的物件就越多,你可以乘機檢查一下自己的**又沒有不必要的耦合,為什麼這個cpp需要知道那麼多的本來可能屬於別的類的細節.....
d.把大多數模組都要使用的庫檔案或者穩定類的標頭檔案include放到預編譯標頭檔案「stdafx.h」裡面
說 明:由於預編譯標頭檔案裡面include的內容只會compile一次而被link多次,把一些常用類放到這裡會降低很多編譯時間,但也不能亂來,要點在 於 「大多數」和「穩定」,如果乙個標頭檔案經常變化,他的一次小改動都會引起整個工程rebuild,哪怕只是乙個注釋,因為所有的cpp檔案都包含了 stdafx.h而stdafx.h又包含了這個容易變動的標頭檔案。
e.使用pimpl慣用法
說明:關於pimpl大家可以查下資料,《c++ coding standards》裡面也有講解,基本上就是採用乙個私有的前向申明的stuct指標把所有protect成員都封裝起來起來.基本上是乙個最終極的解 決方案,但是對我們現有架構改造太大,不敢全面實行,我們只選擇了數個最有價值的類進行了改造,打算以後在其他專案裡面再全面應用。
3。實施: 通過半個小時的溝通,讓專案組程式設計師了解原則,並採取結隊修改的方式來降低引入新bug的風險,在以通過原有單元測試用例的條件下,進行修改-測試-提交的迭代。
4。結果: 編譯時間降低到了6分鐘以內。。。雖沒有達到預期,但也算有效果,沒有完全達標的主要原因還是沒有完整的測試方案包括單元測試和驗收測試,怕有些改動過大影響系統健壯性,區域性放棄了一些實施的原則。
ps:
希望作類似工作的朋友加我的
msn:itso2_at_msn.com
大家多多溝通
ps2: 前日得到一位網友的提點,嘗試使用分布式編譯工具 incedibuild 作為編譯外掛程式,的確編譯時間有巨量下降
一次關於sklearn crfsuite的安裝之旅
為了在windows上跑crf,我需要安裝sklearn crfsuite,最開始想到的是使用pycharm進行環境配置,裝上了sklearn crfsuite。跑起來,額,出錯了 正在訓練評估crf模型.traceback most recent call last file c users cc...
一次關於 的使用
今天遇到了乙個問題,值得一記 首先在我看專案 時發現了乙個問題 有乙個js的export如下 大家可以注意一下config 這裡為什麼要如此寫法呢?首先這裡用的時es6的箭頭函式 而此種寫法 等同於 其實這裡我們可以直接使用config 就 可以,為什麼還要多以一舉,用函式來返回呢,原因是假如我們用...
一次關於工作的決策
配圖一位學長通過了阿里的面試,交接原工作。打算讓我去他公司頂替原本他的工作,給我的薪資在廈門對於同期畢業的同學薪資大約是他們的2倍 3倍。學長第一遍問我要不要去他公司的時候,我回答不方便過去。再和學長聊天的時候,學長又問我要不要再考慮一下呢?這也是一次不錯的機會。聽到學長又給我時間讓我考慮,一方面是...