我們可以使用編譯器高速緩存工具complier cache(ccache)來(lái)加快編譯速度. 如果你經(jīng)?!眒ake clean” ,
ccache能大大縮短再次編譯的時(shí)間 可以通過(guò)設(shè)置以下命令來(lái)啟用ccache。可以將該環(huán)境變量寫入.bashrc或類似文件,避免每次都設(shè)置。 $ export USE_CCACHE=1 默認(rèn)cache存儲(chǔ)在~/.ccache. 可以使用下列命令來(lái)設(shè)置路徑 $ export CCACHE_DIR=<path-to-your-cache-directory> 推薦的cache大小為50-100GB. 可以使用下列命令來(lái)設(shè)置cache size $ prebuilt/linux-x86/ccache/ccache -M 50G (工程目錄下運(yùn)行) 該設(shè)置會(huì)永久存儲(chǔ)在CCACHE_DIR 可以使用以下命令來(lái)查看ccache的運(yùn)行狀況: $ watch -n1 -d prebuilt/linux-x86/ccache/ccache -s (工程目錄下運(yùn)行) 目前在我們的項(xiàng)目中已經(jīng)設(shè)置有ccache,但cache size 偏小,可以重新設(shè)置一下cache size即可。 原理簡(jiǎn)介: ccache 工具通過(guò)將頭文件高速緩存到源文件之中而改進(jìn)了構(gòu)建性能,因而通過(guò)減少每一步編譯時(shí)添加頭文件所需要的時(shí)間而提高了構(gòu)建速度 在標(biāo)準(zhǔn)的編譯過(guò)程中,在 UNIX 下使用 C/C++ 開發(fā)應(yīng)用程序通常需要用到一個(gè)編譯器(如 gcc)以及一個(gè)編譯工具,比如 make。make 和所有的 C 編譯器的問題在于 C 預(yù)處理程序(preprocessor)和頭文件的工作方式。觀察一個(gè)典型的 C 源文件,您會(huì)發(fā)現(xiàn)其中有很多由 #include 所引用的各種頭文件。 每一次編譯一個(gè)文件時(shí),C 預(yù)處理程序(cpp)都會(huì)解析并引入每個(gè)頭文件以及這些頭文件引用到的任何文件。通過(guò)對(duì)內(nèi)容進(jìn)行解析,ccp 可以將一個(gè)相當(dāng)基本的 1-KB 大小的源文件轉(zhuǎn)化為一個(gè) 8-KB 大小的源文件,在這個(gè)過(guò)程中,會(huì)合并入幾十個(gè)甚至幾百個(gè)頭文件。在典型的開發(fā)項(xiàng)目中,有很多與項(xiàng)目相關(guān)的頭文件可能會(huì)在不同的源文件中多次被引入,而且每個(gè)頭文件本身也可能引用很多其他頭文件。 在典型的編譯過(guò)程中,make 工具只編譯自上次編譯后發(fā)生修改的文件,這樣就在很大程度上簡(jiǎn)化了編譯過(guò)程。 make 將必須被編譯的文件限制在經(jīng)過(guò)修改的那些源文件范圍之內(nèi),但是即使是使用 make,仍然有相當(dāng)可觀的浪費(fèi)。每一次編譯項(xiàng)目時(shí),源文件在編譯為匯編語(yǔ)言和最終的機(jī)器代碼之前,都要通過(guò) cpp 進(jìn)行解析。對(duì)每一個(gè)文件來(lái)說(shuō),每一次可能都要重新解析頭文件。從編譯的全過(guò)程來(lái)看,您最后可能多次解析了相同的頭文件,浪費(fèi)了處理器周期,更重要的是浪費(fèi)了開發(fā)者的時(shí)間,因?yàn)樗麄円却@一過(guò)程的完成。在一個(gè)團(tuán)隊(duì)中,這一影響可能會(huì)更為明顯,
因?yàn)槎嗝_發(fā)者可能都會(huì)反復(fù)多次重復(fù)這一過(guò)程,在某一天甚至可能會(huì)同時(shí)進(jìn)行。 ccache(“compiler cache”的縮寫)工具會(huì)高速緩存編譯生成的信息,并在編譯的特定部分使用高速緩存的信息,比如頭文件,這樣就節(jié)省了通常使用 cpp 解析這些信息所需要的時(shí)間。如果您編譯清單 2 中的文件,假定 foobar.h 中包含對(duì)其他頭文件的引用,ccache 會(huì)用那個(gè)文件的 cpp-parsed 版本來(lái)取代 include 聲明。就那么簡(jiǎn)單。不是真正去讀取、理解并解釋其內(nèi)容,ccache 只是將最終的文本拷貝到文件中,使得它可以立即被編譯。 清單 2. 源文件內(nèi)容 #include “foobar.h” void main
|