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

C++分析研究  
C++
日歷
<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
統計
  • 隨筆 - 92
  • 文章 - 4
  • 評論 - 4
  • 引用 - 0

導航

常用鏈接

留言簿

隨筆檔案

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

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

可以想象,如果不加以重視,編譯速度極有可能會成為開發過程中的一個瓶頸。那么,為什么C++它就編譯的這么慢呢?
 

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

每個源文件作為一個編譯單元,可能會包含上百甚至上千個頭文件,而在每一個編譯單元,這些頭文件都會被從硬盤讀進來一遍,然后被解析一遍。
 

每個編譯單元都會產生一個obj文件,然后所以這些obj文件會被link到一起,并且這個過程很難并行。
這里,問題在于無數頭文件的重復load與解析,以及密集的磁盤操作。
 

下面從各個角度給出一些加快編譯速度的做法,主要還是針對上面提出的這個關鍵問題。
 

一、代碼角度
 

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

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

使用Pimpl模式
 

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

高度模塊化
 

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

以頭文件為例,不要把兩個不相關的類,或者沒什么聯系的宏定義放到一個頭文件里。內容要盡量單一,從而不會使包含他們的文件包含了不需要的內容。記得我們曾經做過這么一個事,把代碼中最"hot"的那些頭文件找出來,然后分成多個獨立的小文件,效果相當可觀。
 

其實我們去年做過的refactoring,把眾多DLL分離成UI與Core兩個部分,也是有著相同的效果的 - 提高開發效率。

刪除冗余的頭文件
 

一些代碼經過上十年的開發與維護,經手的人無數,很有可能出現包含了沒用的頭文件,或重復包含的現象,去掉這些冗余的include是相當必要的。當然,這主要是針對cpp的,因為對于一個頭文件,其中的某個include是否冗余很難界定,得看是否在最終的編譯單元中用到了,而這樣又可能出現在一個編譯單元用到了,而在另外一個編譯單元中沒用到的情況。 www.yzyedu.com
 

之前曾寫過一個Perl腳本用來自動去除這些冗余的頭文件,在某個工程中竟然去掉多達了5000多個的include。
 

特別注意inline和template
 

這是C++中兩種比較"先進"的機制,但是它們卻又強制我們在頭文件中包含實現,這對增加頭文件的內容,從而減慢編譯速度有著很大的貢獻。使用之前,權衡一下。
 

二、綜合技巧
 

預編譯頭文件(PCH)
 

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

Unity Build

Unity Build做法很簡單,把所有的cpp包含到一個cpp中(all.cpp) ,然后只編譯all.cpp。這樣我們就只有一個編譯單元,這意味著不需要重復load與解析同一個頭文件了,同時因為只產生一個obj文件,在鏈接的時候也不需要那么密集的磁盤操作了,估計能有10x的提高,看看這個視頻感受一下其做法與速度吧。
 

ccache
 

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

不要有太多的Additional Include Directories
 

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

三、編譯資源
 

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

并行編譯
 

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

更好的磁盤
 

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

分布式編譯
 

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

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

假設你有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分鐘之內。

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

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


 
Copyright © HAOSOLA Powered by: 博客園 模板提供:滬江博客
PK10開獎 PK10開獎
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            在线精品亚洲| 亚洲精品免费观看| 午夜一区二区三视频在线观看| 最近中文字幕日韩精品| 欧美aⅴ99久久黑人专区| 91久久精品日日躁夜夜躁欧美| 欧美激情日韩| 欧美精品videossex性护士| 亚洲区一区二区三区| 亚洲精品国产精品乱码不99| 欧美日韩一区二区三区免费| 亚洲一级二级在线| 亚洲欧美日韩一区二区三区在线观看 | 老司机成人在线视频| 久久久亚洲国产天美传媒修理工 | 国产精品看片资源| 久久精品在这里| 麻豆成人在线观看| 亚洲女人天堂成人av在线| 亚洲欧美精品在线观看| 激情自拍一区| 亚洲毛片在线| 一区视频在线| 一区二区三区欧美成人| 国模私拍一区二区三区| 亚洲国内欧美| 国产亚洲二区| 91久久久一线二线三线品牌| 国产精品一区二区男女羞羞无遮挡| 久久女同互慰一区二区三区| 欧美精品一区二区三| 久久国产欧美精品| 欧美日韩在线观看一区二区三区 | 久久综合国产精品台湾中文娱乐网| 欧美成人dvd在线视频| 亚洲自拍偷拍麻豆| 美女啪啪无遮挡免费久久网站| 亚洲午夜性刺激影院| 久久综合色综合88| 久久精品国产清自在天天线| 欧美激情91| 欧美 日韩 国产 一区| 国产精品人人爽人人做我的可爱| 欧美韩国一区| 狠狠色综合播放一区二区| 一本久久综合亚洲鲁鲁| 亚洲高清资源| 久久久亚洲欧洲日产国码αv| 性欧美精品高清| 欧美日韩一级片在线观看| 亚洲风情亚aⅴ在线发布| 黑人巨大精品欧美一区二区小视频 | 亚洲东热激情| 亚洲一区二区三区四区中文| 99国产精品一区| 葵司免费一区二区三区四区五区| 午夜精品一区二区在线观看 | 亚洲天堂男人| 一本色道久久88综合亚洲精品ⅰ| 你懂的视频欧美| 另类尿喷潮videofree| 国产日本精品| 亚洲欧美在线x视频| 亚洲欧美久久久久一区二区三区| 欧美日本一道本| 亚洲精品乱码| 亚洲精选在线观看| 欧美久久电影| 亚洲精品美女在线观看| 亚洲另类在线视频| 欧美激情在线狂野欧美精品| 亚洲国产另类精品专区| 亚洲精品美女久久久久| 欧美激情一区二区三区高清视频| 亚洲国产精品福利| 在线综合亚洲| 国产精品久久久久久一区二区三区| 一区二区三区免费在线观看| 亚洲一区999| 国产区在线观看成人精品| 欧美一区二区三区成人| 久久久久在线观看| 亚洲国产综合视频在线观看| 欧美国产一区在线| 制服丝袜激情欧洲亚洲| 亚洲欧美激情一区| 国产一区二区中文| 免费欧美网站| 中文欧美在线视频| 久久一区二区三区av| 在线精品亚洲一区二区| 欧美日韩不卡一区| 欧美亚洲视频在线看网址| 老妇喷水一区二区三区| 一本色道久久综合狠狠躁的推荐| 国产精品人人做人人爽人人添| 欧美中文在线观看| 亚洲区一区二区三区| 性欧美video另类hd性玩具| 国语自产在线不卡| 欧美日韩免费高清| 久久av一区二区| 最近中文字幕日韩精品| 欧美在线视频免费观看| 亚洲国产精品激情在线观看| 欧美日韩免费观看一区=区三区| 亚洲男人天堂2024| 亚洲人成啪啪网站| 久久亚洲春色中文字幕| 在线一区二区三区四区五区| 国产欧美一区二区三区另类精品| 免费人成网站在线观看欧美高清| 亚洲一二区在线| 亚洲国产美女精品久久久久∴| 亚洲欧美日韩国产综合精品二区| 亚洲国产另类精品专区| 国产精品日韩久久久久| 欧美精品18videos性欧美| 亚洲欧美三级伦理| 一区二区三区精品视频在线观看| 欧美jjzz| 久久蜜臀精品av| 亚洲欧美国产高清va在线播| 91久久精品美女高潮| 国产日韩一区在线| 欧美性大战久久久久| 模特精品在线| 久久免费高清| 久久爱另类一区二区小说| 这里只有视频精品| 日韩午夜激情| 亚洲欧洲精品一区二区三区| 免费在线观看一区二区| 欧美中文在线观看国产| 亚洲伊人一本大道中文字幕| 亚洲精美视频| 亚洲国产成人精品女人久久久 | 免费观看不卡av| 久久午夜精品| 久久女同互慰一区二区三区| 欧美一区二区三区免费在线看| 亚洲一区二区三区777| 99国产精品国产精品久久 | 国产精品久久久久9999高清| 欧美极品一区| 欧美精品色综合| 欧美理论片在线观看| 欧美成人一区二免费视频软件| 欧美成人精品三级在线观看 | 亚洲日本久久| 亚洲精品在线视频| 亚洲美女色禁图| av成人手机在线| 亚洲天堂偷拍| 欧美在线黄色| 久久人人看视频| 免费中文日韩| 欧美午夜视频在线| 国产精品视频免费一区| 国产欧美日韩综合一区在线播放 | 亚洲福利国产精品| 日韩亚洲一区二区| 性欧美长视频| 久久久久久穴| 欧美福利电影在线观看| 亚洲美女精品一区| 亚洲欧美日本日韩| 蜜桃久久av一区| 欧美日韩视频不卡| 国产日韩精品一区二区浪潮av| 韩国女主播一区| 亚洲欧洲一区二区在线播放| 在线视频欧美精品| 久久国产福利国产秒拍| 久久午夜电影网| 亚洲美女黄色片| 久久精品国产一区二区电影| 欧美成人精品激情在线观看| 欧美午夜精品理论片a级大开眼界| 国产伦精品一区二区三区高清| 在线 亚洲欧美在线综合一区| 一本久久综合| 久久久精品欧美丰满| 最新国产乱人伦偷精品免费网站| 一区二区三区欧美亚洲| 久久久一本精品99久久精品66| 欧美日韩高清在线播放| 国产亚洲欧美色| 亚洲一区二区三区四区五区黄| 久久婷婷丁香| 一区二区三区高清不卡| 免费成人毛片| 国产人成一区二区三区影院| 日韩午夜免费视频| 免费成人在线观看视频| 亚洲一区二区精品视频| 欧美激情视频一区二区三区不卡| 国产一区二区在线观看免费播放| 亚洲一区精彩视频| 亚洲电影在线|