• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            asm, c, c++ are my all
            -- Core In Computer
            posts - 139,  comments - 123,  trackbacks - 0
            一次關(guān)于旨在降低編譯時(shí)間的整改工作(vc++)
            [轉(zhuǎn)自]天爬者


            由于工程的文件的日益龐大和第3方庫(kù)(ACE Loki Boost等等)的使用增多
            我所工作的項(xiàng)目系統(tǒng)構(gòu)建時(shí)間從最初的3分鐘變?yōu)楝F(xiàn)在的8分鐘
            程序員的機(jī)器配置已經(jīng)很不錯(cuò)了,3。0 的主頻1g的內(nèi)存,但是常常由于一個(gè)小的修改導(dǎo)致5分鐘甚至更長(zhǎng)的編譯時(shí)間來(lái)驗(yàn)證效果。

            按照《Joel on software》的說(shuō)法,其直接后果是可怕的:
            程序員們?cè)谶@8分鐘內(nèi)無(wú)所事事,只有查看網(wǎng)頁(yè),或者qqmsn,打斷先前的思路從他們的上下文環(huán)境里面脫離了出來(lái),離開(kāi)了“順勢(shì)工作時(shí)間”,等到他們編譯好了驗(yàn)證再修改的時(shí)候,他們又得花不少的時(shí)間來(lái)回到剛才的思路

            “順勢(shì)工作時(shí)間”大致意思就是說(shuō)2個(gè)不連續(xù)的半小時(shí)的效果遠(yuǎn)不如一個(gè)連續(xù)沉浸的1小時(shí)的工作效果,如果一個(gè)人不能連續(xù)沉浸的思考,那么他就很可能陷入在不停的上下文環(huán)境切換和淺表思考當(dāng)中。人的多線程處理和機(jī)器是一樣的環(huán)境的切換不能夠不考慮

            所以,在當(dāng)前機(jī)器配置已經(jīng)沒(méi)有什么提升空間的情況下,我在項(xiàng)目組內(nèi)部組織了一次整改活動(dòng),旨在降低編譯構(gòu)建時(shí)間


            1。目標(biāo):將完全重新編譯時(shí)間從8分鐘降低到4分鐘以下
            2。原則:通過(guò)和主程序的溝通,并參考了《C++ coding Standards》出了一下幾條整改原則:
            ?????首先是關(guān)于include的,因?yàn)榘^文件相當(dāng)于將代碼復(fù)制到本文件來(lái)編譯,而頭文件又經(jīng)常是用來(lái)被別人包含的,所以工程文件多了,每個(gè)文件都有include鏈(包含的文件又include了其他文件),該鏈條不會(huì)止步于你工程,而會(huì)延伸到你所有使用的第3方庫(kù)里面

            ?????A.
            能夠去掉的include就去掉。

            ?????B.能夠在cpp
            里面include的頭文件不要在頭文件里面include。
            ?????
            說(shuō)明:盡量去掉每個(gè)cpp會(huì)被串起來(lái)的頭文件膨脹的機(jī)會(huì)

            ?????
            C.能夠用前向聲明的就不要include,頭文件里面也是一樣
            ???? 說(shuō)明:在頭文件里面用前向聲明然后保存指針或者引用,在具體實(shí)現(xiàn)的cpp里面再包含頭文件,雖然看起來(lái)和《C++ coding Standards》“
            Make header files self-sufficient ”有些沖突(前兩天另外cppblog一位朋友講過(guò) http://www.shnenglu.com/flyingxu/archive/2006/06/23/8908.html )但是在一些核心的.h(被很多類include的)里面作改造工作,還是能夠收到很大的降低編譯時(shí)間效果,而付出的代價(jià)就是原來(lái)只需要包含該頭文件就可以編譯成功的cpp需要額外包含一些頭文件。

            舉個(gè)例子: Foo類頭文件使用了前向申明保存了A類和B類的指針或者引用為成員變量,在Foo類的cpp里面才包含A和B的頭文件,而當(dāng)C類需要使用Foo類時(shí)候包含F(xiàn)oo類的頭文件,但是操作中又需要調(diào)用A的成員函數(shù),C不同時(shí)包含A的頭文件的花就會(huì)出現(xiàn)編譯失敗。

            雖然表面上是讓代碼更加復(fù)雜了,但是除卻帶來(lái)降低編譯時(shí)間的好處之外,代碼也在強(qiáng)迫你進(jìn)行解耦合,如果說(shuō)你cpp里面需要包含的頭文件越多,說(shuō)明你這個(gè)類需要知道的對(duì)象就越多,你可以乘機(jī)檢查一下自己的代碼又沒(méi)有不必要的耦合,為什么這個(gè)cpp需要知道那么多的本來(lái)可能屬于別的類的細(xì)節(jié).....

            ??????D。
            把大多數(shù)模塊都要使用的庫(kù)文件或者穩(wěn)定類的頭文件include放到預(yù)編譯頭文件“stdafx.h”里面
            ??????
            說(shuō)明:由于預(yù)編譯頭文件里面include的內(nèi)容只會(huì)compile一次而被link多次,把一些常用類放到這里會(huì)降低很多編譯時(shí)間,但也不能亂來(lái),要點(diǎn)在于 “大多數(shù)”和“穩(wěn)定”,如果一個(gè)頭文件經(jīng)常變化,他的一次小改動(dòng)都會(huì)引起整個(gè)工程rebuild,哪怕只是一個(gè)注釋,因?yàn)樗械腸pp文件都包含了stdafx.h而stdafx.h又包含了這個(gè)容易變動(dòng)的頭文件。
            ??????
            ??????
            E.使用Pimpl慣用法
            ??????說(shuō)明:關(guān)于Pimpl大家可以查下資料,《C++ coding Standards》里面也有講解,基本上就是采用一個(gè)私有的前向申明的stuct指針把所有protect成員都封裝起來(lái)起來(lái).基本上是一個(gè)最終極的解決方案,但是對(duì)我們現(xiàn)有架構(gòu)改造太大,不敢全面實(shí)行,我們只選擇了數(shù)個(gè)最有價(jià)值的類進(jìn)行了改造,打算以后在其他項(xiàng)目里面再全面應(yīng)用。

            3。實(shí)施: 通過(guò)半個(gè)小時(shí)的溝通,讓項(xiàng)目組程序員了解原則,并采取結(jié)隊(duì)修改的方式來(lái)降低引入新bug的風(fēng)險(xiǎn),在以通過(guò)原有單元測(cè)試用例的條件下,進(jìn)行修改-測(cè)試-提交的迭代。
            ???

            4。結(jié)果:???編
            譯時(shí)間降低到了6分鐘以內(nèi)。。。雖沒(méi)有達(dá)到預(yù)期,但也算有效果,沒(méi)有完全達(dá)標(biāo)的主要原因還是沒(méi)有完整的測(cè)試方案包括單元測(cè)試和驗(yàn)收測(cè)試,怕有些改動(dòng)過(guò)大影響系統(tǒng)健壯性,局部放棄了一些實(shí)施的原則。


            把這個(gè)整改的工作寫出來(lái),一方面作個(gè)記錄,另外一方面希望和大家討論,相互多多交流:)
            posted on 2006-07-04 03:38 Jerry Cat 閱讀(486) 評(píng)論(1)  編輯 收藏 引用

            FeedBack:
            # re: 一次關(guān)于旨在降低編譯時(shí)間的整改工作(vc++)
            2007-07-09 14:18 | NDD
            上述措施只能在合理范圍內(nèi)解決rebuild時(shí)間長(zhǎng)的問(wèn)題

            使用Distcc 或者 Incredibuild 增加計(jì)算能力可以克服文件的正常增加  回復(fù)  更多評(píng)論
              

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理



            <2006年9月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            常用鏈接

            留言簿(7)

            隨筆檔案

            最新隨筆

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久久久久久尹人综合网亚洲| 亚洲欧美国产精品专区久久| 久久久国产精品亚洲一区| 狠狠色丁香婷婷综合久久来| 精品国产热久久久福利| 性做久久久久久免费观看| 中文字幕无码精品亚洲资源网久久| 日韩精品久久无码人妻中文字幕| 久久国产亚洲精品麻豆| 久久精品国产亚洲Aⅴ香蕉 | 久久久WWW免费人成精品| 久久亚洲AV成人无码软件| 久久精品国产亚洲沈樵| 国产成人精品久久| 精品国产91久久久久久久a| 久久香蕉超碰97国产精品| 久久九色综合九色99伊人| 国产精品18久久久久久vr| 久久99亚洲网美利坚合众国| 四虎影视久久久免费| 色综合久久精品中文字幕首页| 久久精品国产亚洲AV久| 日韩欧美亚洲综合久久影院Ds | 久久国产精品免费一区| 无码日韩人妻精品久久蜜桃 | 久久亚洲国产午夜精品理论片| 精品久久久久久久久免费影院| 色综合色天天久久婷婷基地| 久久棈精品久久久久久噜噜| 久久婷婷五月综合色奶水99啪| 久久综合视频网站| 久久精品国产亚洲一区二区三区| 精品久久久久久综合日本| 99精品久久久久中文字幕| 国产亚洲精品美女久久久| 久久久久成人精品无码中文字幕 | 久久亚洲AV无码精品色午夜 | 狠狠色丁香久久综合婷婷| 久久综合久久自在自线精品自| 青青草原精品99久久精品66| 日产精品久久久久久久|