青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++分析研究  
C++
日歷
<2011年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
統(tǒng)計(jì)
  • 隨筆 - 92
  • 文章 - 4
  • 評(píng)論 - 4
  • 引用 - 0

導(dǎo)航

常用鏈接

留言簿

隨筆檔案

文章檔案

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

 
C++代碼一直以其運(yùn)行時(shí)的高性能高調(diào)面對(duì)世人, 但是說(shuō)起編譯速度,卻只有低調(diào)的份了。比如我現(xiàn)在工作的源代碼,哪怕使用Incredibuild調(diào)動(dòng)近百臺(tái)機(jī)子,一個(gè)完整的build也需要四個(gè)小時(shí),恐怖!!!雖然平時(shí)開(kāi)發(fā)一般不需要在本地做完整的build,但編譯幾個(gè)相關(guān)的工程就夠你等上好一段時(shí)間的了(老外管這個(gè)叫monkey around,相當(dāng)形象)。想想若干年在一臺(tái)單核2.8GHZ上工作時(shí)的場(chǎng)景 - 面前放本書(shū),一點(diǎn)build按鈕,就低頭讀一會(huì)書(shū)~~~往事不堪回首。
 

可以想象,如果不加以重視,編譯速度極有可能會(huì)成為開(kāi)發(fā)過(guò)程中的一個(gè)瓶頸。那么,為什么C++它就編譯的這么慢呢?
 

我想最重要的一個(gè)原因應(yīng)該是C++基本的"頭文件-源文件"的編譯模型:
 

每個(gè)源文件作為一個(gè)編譯單元,可能會(huì)包含上百甚至上千個(gè)頭文件,而在每一個(gè)編譯單元,這些頭文件都會(huì)被從硬盤(pán)讀進(jìn)來(lái)一遍,然后被解析一遍。
 

每個(gè)編譯單元都會(huì)產(chǎn)生一個(gè)obj文件,然后所以這些obj文件會(huì)被link到一起,并且這個(gè)過(guò)程很難并行。
這里,問(wèn)題在于無(wú)數(shù)頭文件的重復(fù)load與解析,以及密集的磁盤(pán)操作。
 

下面從各個(gè)角度給出一些加快編譯速度的做法,主要還是針對(duì)上面提出的這個(gè)關(guān)鍵問(wèn)題。
 

一、代碼角度
 

在頭文件中使用前置聲明,而不是直接包含頭文件。
 

不要以為你只是多加了一個(gè)頭文件,由于頭文件的"被包含"特性,這種效果可能會(huì)被無(wú)限放大。所以,要盡一切可能使頭文件精簡(jiǎn)。很多時(shí)候前置申明某個(gè)namespace中的類會(huì)比較痛苦,而直接include會(huì)方便很多,千萬(wàn)要抵制住這種誘惑;類的成員,函數(shù)參數(shù)等也盡量用引用,指針,為前置聲明創(chuàng)造條件。
 

使用Pimpl模式
 

Pimpl全稱為Private Implementation。傳統(tǒng)的C++的類的接口與實(shí)現(xiàn)是混淆在一起的,而Pimpl這種做法使得類的接口與實(shí)現(xiàn)得以完全分離。如此,只要類的公共接口保持不變,對(duì)類實(shí)現(xiàn)的修改始終只需編譯該cpp;同時(shí),該類提供給外界的頭文件也會(huì)精簡(jiǎn)許多。
 

高度模塊化
 

模塊化就是低耦合,就是盡可能的減少相互依賴。這里其實(shí)有兩個(gè)層面的意思。一是文件與文件之間,一個(gè)頭文件的變化,盡量不要引起其他文件的重新編譯;二是工程與工程之間,對(duì)一個(gè)工程的修改,盡量不要引起太多其他工程的編譯。這就要求頭文件,或者工程的內(nèi)容一定要單一,不要什么東西都往里面塞,從而引起不必要的依賴。這也可以說(shuō)是內(nèi)聚性吧。 www.liuhebao.com
 

以頭文件為例,不要把兩個(gè)不相關(guān)的類,或者沒(méi)什么聯(lián)系的宏定義放到一個(gè)頭文件里。內(nèi)容要盡量單一,從而不會(huì)使包含他們的文件包含了不需要的內(nèi)容。記得我們?cè)?jīng)做過(guò)這么一個(gè)事,把代碼中最"hot"的那些頭文件找出來(lái),然后分成多個(gè)獨(dú)立的小文件,效果相當(dāng)可觀。
 

其實(shí)我們?nèi)ツ曜鲞^(guò)的refactoring,把眾多DLL分離成UI與Core兩個(gè)部分,也是有著相同的效果的 - 提高開(kāi)發(fā)效率。

刪除冗余的頭文件
 

一些代碼經(jīng)過(guò)上十年的開(kāi)發(fā)與維護(hù),經(jīng)手的人無(wú)數(shù),很有可能出現(xiàn)包含了沒(méi)用的頭文件,或重復(fù)包含的現(xiàn)象,去掉這些冗余的include是相當(dāng)必要的。當(dāng)然,這主要是針對(duì)cpp的,因?yàn)閷?duì)于一個(gè)頭文件,其中的某個(gè)include是否冗余很難界定,得看是否在最終的編譯單元中用到了,而這樣又可能出現(xiàn)在一個(gè)編譯單元用到了,而在另外一個(gè)編譯單元中沒(méi)用到的情況。 www.yzyedu.com
 

之前曾寫(xiě)過(guò)一個(gè)Perl腳本用來(lái)自動(dòng)去除這些冗余的頭文件,在某個(gè)工程中竟然去掉多達(dá)了5000多個(gè)的include。
 

特別注意inline和template
 

這是C++中兩種比較"先進(jìn)"的機(jī)制,但是它們卻又強(qiáng)制我們?cè)陬^文件中包含實(shí)現(xiàn),這對(duì)增加頭文件的內(nèi)容,從而減慢編譯速度有著很大的貢獻(xiàn)。使用之前,權(quán)衡一下。
 

二、綜合技巧
 

預(yù)編譯頭文件(PCH)
 

把一些常用但不常改動(dòng)的頭文件放在預(yù)編譯頭文件中。這樣,至少在單個(gè)工程中你不需要在每個(gè)編譯單元里一遍又一遍的load與解析同一個(gè)頭文件了。
 

Unity Build

Unity Build做法很簡(jiǎn)單,把所有的cpp包含到一個(gè)cpp中(all.cpp) ,然后只編譯all.cpp。這樣我們就只有一個(gè)編譯單元,這意味著不需要重復(fù)load與解析同一個(gè)頭文件了,同時(shí)因?yàn)橹划a(chǎn)生一個(gè)obj文件,在鏈接的時(shí)候也不需要那么密集的磁盤(pán)操作了,估計(jì)能有10x的提高,看看這個(gè)視頻感受一下其做法與速度吧。
 

ccache
 

compiler cache, 通過(guò)cache上一次編譯的結(jié)果,使rebuild在保持結(jié)果相同的情況下,極大的提高速度。我們知道如果是build,系統(tǒng)會(huì)對(duì)比源代碼與目標(biāo)代碼的時(shí)間來(lái)決定是否要重新編譯某個(gè)文件,這個(gè)方法其實(shí)并不完全可靠(比如從svn上拿了上個(gè)版本的代碼),而ccache判斷的原則則是文件的內(nèi)容,相對(duì)來(lái)講要可靠的多。很可惜的是,Visual Studio現(xiàn)在還不支持這個(gè)功能 - 其實(shí)完全可以加一個(gè)新的命令,比如cache build,介于build與rebuild之間,這樣,rebuild就可以基本不用了。
 

不要有太多的Additional Include Directories
 

編譯器定位你include的頭文件,是根據(jù)你提供的include directories進(jìn)行搜索的。可以想象,如果你提供了100個(gè)包含目錄,而某個(gè)頭文件是在第100個(gè)目錄下,定位它的過(guò)程是非常痛苦的。組織好你的包含目錄,并盡量保持簡(jiǎn)潔。 www.yzjxsp.com
 

三、編譯資源
 

要提高速度,要么減少任務(wù),要么加派人手,前面兩個(gè)方面講得都是減少任務(wù),而事實(shí)上,在提高編譯速度這塊,加派人手還是有著非常重要的作用的。
 

并行編譯
 

買個(gè)4核的,或者8核的cpu,每次一build,就是8個(gè)文件并行著編,那速度,看著都爽。 要是你們老板不同意,讓他讀讀這篇文章:Hardware is Cheap, Programmers are Expensive
 

更好的磁盤(pán)
 

我們知道,編譯速度慢很大一部分原因是磁盤(pán)操作,那么除了盡可能的減少磁盤(pán)操作,我們還可以做的就是加快磁盤(pán)速度。比如上面8個(gè)核一塊工作的時(shí)候,磁盤(pán)極有可能成為最大的瓶頸。買個(gè)15000轉(zhuǎn)的磁盤(pán),或者SSD,或者RAID0的,總之,越快越好。 www.jokedu.com
 

分布式編譯
 

一臺(tái)機(jī)子的性能始終是有限的,利用網(wǎng)絡(luò)中空閑的cpu資源,以及專門(mén)用來(lái)編譯的build server來(lái)幫助你編譯才能從根本上解決我們編譯速度的問(wèn)題,想想原來(lái)要build 1個(gè)多小時(shí)工程的在2分鐘內(nèi)就能搞定,你就知道你一定不能沒(méi)有它 - Incredibuild并行,其實(shí)還可以這么做。

這是一個(gè)比較極端的情況,如果你用了Incredibuild,對(duì)最終的編譯速度還是不滿意,怎么辦?其實(shí)只要跳出思維的框架,編譯速度還是可以有質(zhì)的飛躍的 - 前提是你有足夠多的機(jī)器:
 

假設(shè)你有solution A和solution B,B依賴于A,所以必須在A之后Build B。其中A,B Build各需要1個(gè)小時(shí),那么總共要2個(gè)小時(shí)。可是B一定要在A之后build嗎?跳出這個(gè)思維框架,你就有了下述方案:
 

同時(shí)開(kāi)始build A和B 。
 

A的build成功,這里雖然B的build失敗了,但都只是失敗在最后的link上。
 

重新link B中的project。
 

這樣,通過(guò)讓A的build與B的編譯并行,最后link一下B中的project,整個(gè)編譯速度應(yīng)該能夠控制在1個(gè)小時(shí)15分鐘之內(nèi)。

posted on 2011-07-25 23:04 HAOSOLA 閱讀(348) 評(píng)論(0)  編輯 收藏 引用

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


 
Copyright © HAOSOLA Powered by: 博客園 模板提供:滬江博客
PK10開(kāi)獎(jiǎng) PK10開(kāi)獎(jiǎng)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产网站欧美日韩免费精品在线观看 | 欧美激情一区二区三区在线| 亚洲欧美国产日韩中文字幕| 一区二区三区国产精品| 亚洲网站在线观看| 午夜国产精品视频| 欧美专区第一页| 美女被久久久| 亚洲免费播放| 亚洲欧美成人综合| 久久久蜜臀国产一区二区| 亚洲一区亚洲| 激情91久久| 亚洲国产精品女人久久久| 韩国精品久久久999| 亚洲高清在线观看一区| 日韩视频专区| 欧美在线免费播放| 亚洲国产婷婷香蕉久久久久久99| 日韩视频精品在线| 午夜精品区一区二区三| 欧美在线影院在线视频| 欧美福利视频在线| 亚洲一区二区久久| 欧美韩日精品| 国产综合色在线| 99riav国产精品| 欧美伊久线香蕉线新在线| 欧美成在线观看| 亚洲欧美日韩国产一区二区三区| 老司机一区二区三区| 国产精品国产| 99视频精品在线| 美女诱惑黄网站一区| 亚洲天堂久久| 欧美日本精品| 亚洲国产视频a| 久久久噜噜噜久久狠狠50岁| 一本一本久久a久久精品综合妖精| 久久男人资源视频| 国产综合一区二区| 久久不射网站| 亚洲午夜激情网页| 欧美日韩mp4| 亚洲欧洲一区二区天堂久久 | 免费在线一区二区| 欧美在线一级va免费观看| 欧美性事免费在线观看| 亚洲精品日本| 欧美高清在线播放| 老司机精品视频网站| 激情综合电影网| 久久婷婷国产麻豆91天堂| 亚洲免费一在线| 国产人久久人人人人爽| 亚洲欧美一区二区视频| 一区二区三区四区蜜桃| 国产精品二区二区三区| 亚洲一区二区成人| 制服丝袜激情欧洲亚洲| 欧美体内谢she精2性欧美| 亚洲午夜视频在线| 亚洲午夜精品一区二区三区他趣| 欧美色网在线| 亚洲一区二区三区在线看| 这里只有精品视频| 亚洲精品日韩欧美| 欧美日韩精品一区二区| 一区二区三区高清| 99这里只有精品| 国产精品成人一区二区网站软件| 亚洲欧美国产精品桃花| 午夜一区不卡| 一区二区在线视频观看| 欧美肥婆bbw| 欧美日韩直播| 久久精品噜噜噜成人av农村| 久久精品国产99国产精品澳门| 在线免费精品视频| 亚洲精品日韩一| 国产精自产拍久久久久久| 久久婷婷综合激情| 欧美精品激情| 先锋影音一区二区三区| 久久久精品久久久久| 一二三四社区欧美黄| 亚洲欧美日韩系列| 91久久中文字幕| 亚洲一区二区综合| 亚洲第一视频网站| 亚洲视频导航| 亚洲国产另类久久精品| a4yy欧美一区二区三区| 黑人巨大精品欧美黑白配亚洲| 亚洲狠狠丁香婷婷综合久久久| 国产精品久久看| 亚洲国产cao| 国产偷自视频区视频一区二区| 欧美成人视屏| 国产欧美va欧美不卡在线| 亚洲第一区色| 国产一区白浆| 一本色道婷婷久久欧美| 亚洲高清一二三区| 亚洲女爱视频在线| 一区二区日韩精品| 久久免费高清视频| 久久精品成人一区二区三区| 欧美日韩国产999| 一区二区视频免费完整版观看| 亚洲电影免费在线| 揄拍成人国产精品视频| 亚洲午夜久久久| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲一区二区在线观看视频| 亚洲人成网在线播放| 欧美在线观看一区| 亚洲中字黄色| 欧美日韩久久精品| 亚洲国产日韩欧美综合久久| 影音先锋亚洲视频| 欧美一区1区三区3区公司| 亚洲男人av电影| 亚洲韩国青草视频| 欧美精品123区| 美女主播视频一区| 免费在线观看精品| 久久综合伊人77777蜜臀| 国产精品人成在线观看免费| 亚洲国产人成综合网站| 久久国产精品久久久久久久久久| 亚洲一区二区在线免费观看视频| 欧美国产视频日韩| 亚洲黄色一区| 亚洲理论在线观看| 欧美激情在线有限公司| 亚洲电影在线看| 亚洲国产专区校园欧美| 美女国产一区| 亚洲激情成人在线| 99日韩精品| 国产精品高潮视频| 午夜欧美大尺度福利影院在线看 | 在线视频亚洲一区| 欧美日韩日日骚| 亚洲图片欧美一区| 午夜在线a亚洲v天堂网2018| 国产精品黄色| 性欧美8khd高清极品| 久久久一二三| 亚洲第一区在线观看| 美女国产一区| 亚洲美女视频在线观看| 亚洲免费人成在线视频观看| 国产精品久久久久久福利一牛影视| 亚洲精品一区二区三区在线观看| 亚洲一级黄色av| 国产欧美日韩免费看aⅴ视频| 欧美一区二区三区免费视频| 欧美阿v一级看视频| 日韩视频在线你懂得| 国产精品久久久一区麻豆最新章节 | 麻豆av一区二区三区久久| 亚洲国产精品一区二区第一页 | 欧美一区二区三区四区高清| 蘑菇福利视频一区播放| 夜夜嗨av一区二区三区免费区| 国产精品成av人在线视午夜片| 亚洲午夜精品久久久久久浪潮| 久久精品人人做人人爽| 91久久国产综合久久91精品网站| 欧美日韩精品在线播放| 午夜在线一区| 亚洲人久久久| 久久亚裔精品欧美| 亚洲午夜精品| **欧美日韩vr在线| 国产精品成人在线观看| 久久天天躁夜夜躁狠狠躁2022 | 欧美精品激情| 久久国产主播精品| 韩日欧美一区| 亚洲欧美日韩另类精品一区二区三区 | 精品1区2区| 欧美精品一卡| 欧美在线免费视频| 夜夜嗨av一区二区三区四季av| 久久婷婷亚洲| 亚洲欧美一区二区激情| 亚洲激情网站| 国产婷婷精品| 国产精品高潮呻吟久久av黑人| 久久婷婷激情| 校园激情久久| 一本色道久久88综合日韩精品| 欧美 日韩 国产一区二区在线视频| 亚洲午夜在线观看| 一本久道久久久| 亚洲精品之草原avav久久| 国产最新精品精品你懂的|