導航:首頁 > 源碼編譯 > c編譯速度優化

c編譯速度優化

發布時間:2024-07-11 02:36:54

『壹』 如何加快linux android編譯速度

項目越來越大,每次需要重新編譯整個項目都是一件很浪費時間的事情。Research了一下,找到以下可以幫助提高速度的方法,總結一下。
1. 使用tmpfs來代替部分IO讀寫
2.ccache,可以將ccache的緩存文件設置在tmpfs上,但是這樣的話,每次開機後,ccache的緩存文件會丟失
3.distcc,多機器編譯
4.將屏幕輸出列印到內存文件或者/dev/null中,避免終端設備(慢速設備)拖慢速度。

tmpfs
有人說在Windows下用了RAMDisk把一個項目編譯時間從4.5小時減少到了5分鍾,也許這個數字是有點誇張了,不過粗想想,把文件放到內存上做編譯應該是比在磁碟上快多了吧,尤其如果編譯器需要生成很多臨時文件的話。
這個做法的實現成本最低,在Linux中,直接mount一個tmpfs就可以了。而且對所編譯的工程沒有任何要求,也不用改動編譯環境。
mount -t tmpfs tmpfs ~/build -o size=1G
用2.6.32.2的Linux Kernel來測試一下編譯速度:
用物理磁碟:40分16秒
用tmpfs:39分56秒
呃……沒什麼變化。看來編譯慢很大程度上瓶頸並不在IO上面。但對於一個實際項目來說,編譯過程中可能還會有打包等IO密集的操作,所以只要可能,用tmpfs是有益無害的。當然對於大項目來說,你需要有足夠的內存才能負擔得起這個tmpfs的開銷。
make -j
既然IO不是瓶頸,那CPU就應該是一個影響編譯速度的重要因素了。
用make -j帶一個參數,可以把項目在進行並行編譯,比如在一台雙核的機器上,完全可以用make -j4,讓make最多允許4個編譯命令同時執行,這樣可以更有效的利用CPU資源。
還是用Kernel來測試:
用make: 40分16秒
用make -j4:23分16秒
用make -j8:22分59秒
由此看來,在多核CPU上,適當的進行並行編譯還是可以明顯提高編譯速度的。但並行的任務不宜太多,一般是以CPU的核心數目的兩倍為宜。
不過這個方案不是完全沒有cost的,如果項目的Makefile不規范,沒有正確的設置好依賴關系,並行編譯的結果就是編譯不能正常進行。如果依賴關系設置過於保守,則可能本身編譯的可並行度就下降了,也不能取得最佳的效果。
ccache
ccache工作原理:
ccache也是一個編譯器驅動器。第一趟編譯時ccache緩存了GCC的「-E」輸出、編譯選項以及.o文件到$HOME/.ccache。第二次編譯時盡量利用緩存,必要時更新緩存。所以即使"make clean; make"也能從中獲得好處。ccache是經過仔細編寫的,確保了與直接使用GCC獲得完全相同的輸出。

ccache用於把編譯的中間結果進行緩存,以便在再次編譯的時候可以節省時間。這對於玩Kernel來說實在是再好不過了,因為經常需要修改一些Kernel的代碼,然後再重新編譯,而這兩次編譯大部分東西可能都沒有發生變化。對於平時開發項目來說,也是一樣。為什麼不是直接用make所支持的增量編譯呢?還是因為現實中,因為Makefile的不規范,很可能這種「聰明」的方案根本不能正常工作,只有每次make clean再make才行。
安裝完ccache後,可以在/usr/local/bin下建立gcc,g++,c++,cc的symbolic link,鏈到/usr/bin/ccache上。總之確認系統在調用gcc等命令時會調用到ccache就可以了(通常情況下/usr/local /bin會在PATH中排在/usr/bin前面)。
安裝的另外一種方法:
vi ~/.bash_profile
把/usr/lib/ccache/bin路徑加到PATH下
PATH=/usr/lib/ccache/bin:$PATH:$HOME/bin
這樣每次啟動g++的時候都會啟動/usr/lib/ccache/bin/g++,而不會啟動/usr/bin/g++
效果跟使用命令行ccache g++效果一樣
這樣每次用戶登錄時,使用g++編譯器時會自動啟動ccache
繼續測試:
用ccache的第一次編譯(make -j4):23分38秒
用ccache的第二次編譯(make -j4):8分48秒
用ccache的第三次編譯(修改若干配置,make -j4):23分48秒

看來修改配置(我改了CPU類型...)對ccache的影響是很大的,因為基本頭文件發生變化後,就導致所有緩存數據都無效了,必須重頭來做。但如果只是修改一些.c文件的代碼,ccache的效果還是相當明顯的。而且使用ccache對項目沒有特別的依賴,布署成本很低,這在日常工作中很實用。
可以用ccache -s來查看cache的使用和命中情況:
cache directory /home/lifanxi/.ccachecache hit 7165cache miss 14283called for link 71not a C/C++ file 120no input file 3045files in cache 28566cache size 81.7 Mbytesmax cache size 976.6 Mbytes
可以看到,顯然只有第二編次譯時cache命中了,cache miss是第一次和第三次編譯帶來的。兩次cache佔用了81.7M的磁碟,還是完全可以接受的。
distcc
一台機器的能力有限,可以聯合多台電腦一起來編譯。這在公司的日常開發中也是可行的,因為可能每個開發人員都有自己的開發編譯環境,它們的編譯器版本一般是一致的,公司的網路也通常具有較好的性能。這時就是distcc大顯身手的時候了。
使用distcc,並不像想像中那樣要求每台電腦都具有完全一致的環境,它只要求源代碼可以用make -j並行編譯,並且參與分布式編譯的電腦系統中具有相同的編譯器。因為它的原理只是把預處理好的源文件分發到多台計算機上,預處理、編譯後的目標文件的鏈接和其它除編譯以外的工作仍然是在發起編譯的主控電腦上完成,所以只要求發起編譯的那台機器具備一套完整的編譯環境就可以了。
distcc安裝後,可以啟動一下它的服務:
/usr/bin/distccd --daemon --allow 10.64.0.0/16
默認的3632埠允許來自同一個網路的distcc連接。
然後設置一下DISTCC_HOSTS環境變數,設置可以參與編譯的機器列表。通常localhost也參與編譯,但如果可以參與編譯的機器很多,則可以把localhost從這個列表中去掉,這樣本機就完全只是進行預處理、分發和鏈接了,編譯都在別的機器上完成。因為機器很多時,localhost的處理負擔很重,所以它就不再「兼職」編譯了。
export DISTCC_HOSTS="localhost 10.64.25.1 10.64.25.2 10.64.25.3"
然後與ccache類似把g++,gcc等常用的命令鏈接到/usr/bin/distcc上就可以了。
在make的時候,也必須用-j參數,一般是參數可以用所有參用編譯的計算機CPU內核總數的兩倍做為並行的任務數。
同樣測試一下:
一台雙核計算機,make -j4:23分16秒
兩台雙核計算機,make -j4:16分40秒
兩台雙核計算機,make -j8:15分49秒
跟最開始用一台雙核時的23分鍾相比,還是快了不少的。如果有更多的計算機加入,也可以得到更好的效果。
在編譯過程中可以用distccmon-text來查看編譯任務的分配情況。distcc也可以與ccache同時使用,通過設置一個環境變數就可以做到,非常方便。
總結一下:
tmpfs: 解決IO瓶頸,充分利用本機內存資源
make -j: 充分利用本機計算資源
distcc: 利用多台計算機資源
ccache: 減少重復編譯相同代碼的時間
這些工具的好處都在於布署的成本相對較低,綜合利用這些工具,就可以輕輕鬆鬆的節省相當可觀的時間。上面介紹的都是這些工具最基本的用法,更多的用法可以參考它們各自的man page。
5.還有提速方法是把屏幕輸出重定向到內存文件或/dev/null,因對終端設備(慢速設備)的阻塞寫操作也會拖慢速度。推薦內存文件,這樣發生錯誤時,能夠查看。

『貳』 Xcode 構建速度優化(一)衡量編譯時間

隨著項目不斷迭代,工程文件越來越多,引用的三方庫也越來越多,這些直接導致編譯時間的不斷增加,完整編譯一次項目動輒需要五分鍾以上時間,實在有些影響開發效率,是時候來一波提速了。

為編譯和構建提速,首先我們需要對速度有一個衡量標准:准確獲得構建用時

首先,我們需要定義要衡量和優化的內容。 有兩種選擇:

xcode默認情況下會跟蹤所有構建,我們可以通過更改xcode相關設置,來在活動查看器中顯示出構建時間,通過命令行:

每次編譯成功後,會在Successed之後顯示出所用時間:

Xcode Build Timing Summary是Xcode10中加入的用於查看獲取構建時間和發現用時瓶頸方面的最有利工具。 可以通過Proct->Perform Action->Build With Timing Summary來開啟:這樣在 Build Log 的末尾就會添加 Timing Summary Log。我們可以通過這個 log 看到哪個階段是耗時的,便於我們進行優化。

如上圖中: xib階段的編譯耗時明顯是比普通c文件要多的,意味著我們可以通過減少xib方式來優化提升速度
而c文件的編譯用時比總時間還要長,是因為c文件是並行編譯的

在命令行中同樣可以開啟這個功能:

常用的第三方工具有 BuildTimeAnalyzer 、 xcode-build-times-rendering 、 XCLogParser 。

BuildTimeAnalyzer可以統計可以得出某個文件的類型檢查時長,每個表達式的類型檢查時長。

xcode-build-times-rendering是一個Ruby編寫的第三方工具,可以方便地分別測量目標的構建時間並在圖表上顯示它們,使用gem安裝

接下來使用這個工具自帶命令配置項目

然後構建項目並生成報告:

這個工具使用上比較簡單,缺點是只能從宏觀上生成各個target編譯的整體圖標,無法詳細列出各個內部編譯明細

XCLogParser可以詳細列出各個Target和內部每個文件的編譯耗時,對我們分析編譯時間瓶頸非常有幫助,它的工作原理主要是做為解析器,通過解析xcode編譯生成的xcactivitylog日誌來記錄
安裝:

編譯項目後,進行安裝

安裝成功後通過命令:

會自動在當前目錄的 build/xclogparser/reports/ 路徑下生成報告,其中--project參數需要設置為待分析項目的名字,並注意當前在終端切換到希望寫入日誌的目錄。

報告截圖:

這個工具將作為我們後面分析提升編譯構建速度的主要使用工具。

經過我多次在不同時間段,不同電腦上不斷嘗試編譯,
我發現編譯耗時是一個比較玄的東西,及時在同一台電腦,同一個項目, 同一套環境配置下,編譯用時也會隨著電腦當前狀態(包括同時打開進程、散熱等等)上下大幅跳動,就像演算法時間復雜度一樣,有時候我們明明做了一些細微的優化,但是結果反而是編譯耗時增加了,這是很正常的事情
所以,衡量這個標准需要我們取多次試驗中的平均值作為參考。

『叄』 5涓浼樺寲浠g爜鐨勫皬鎶宸т笓涓氬︾敓鏉ョ湅

5涓浼樺寲Python 浠g爜鐨勫皬鎶宸

璁╀綘浠g爜鏇翠笂涓灞傛ゼ

5涓浼樺寲Python浠g爜鐨勫皬鎶宸

1.鎬ц兘浼樺寲鐨勫垎鏋

鍒嗘瀽鏄嫻嬮噺鍜屽垎鏋愪唬鐮佺殑鎬ц兘浠ヨ瘑鍒鎬ц兘鐡墮堢殑榪囩▼銆侾ython

鎻愪緵浜嗗唴緗鐨勬ā鍧楋紝 濡俢 Profile鍜宼ime it錛 鍙浠ョ敤鏉ヨ繘琛屽垎鏋愩

鍙浠ヤ嬌鐢╟ Profile鏉ュ垎鏋愪唬鐮佷腑涓嶅悓鍑芥暟鎴栨柟娉曟墍鑺辮垂鐨勬椂闂達紝

浣跨敤time it鏉ユ祴閲忕壒瀹氫唬鐮佺墖孌電殑鎵ц屾椂闂淬傝繖閲屾湁涓涓紺轟緥錛

鍦ㄦょず渚嬩腑錛 瀵逛袱涓鍑芥暟slow_function鍜宖ast_function榪

琛屽垎鏋愶紝浠ユ祴閲忓畠浠鐨勬墽琛屾椂闂淬傚垎鏋愮粨鏋滃彲浠ュ府鍔╃『瀹氬摢涓鍑

鏁扮殑鎵ц屾椂闂存洿闀匡紝鍙浠ヨ繘涓姝ヤ紭鍖栥

2.浼樺寲鏁版嵁緇撴瀯

閫夋嫨姝g『鐨勬暟鎹緇撴瀯鍙浠ユ樉钁楀獎鍝峆ython浠g爜鐨勬ц兘銆

Python鎻愪緵浜嗗氱嶅唴緗鐨勬暟鎹緇撴瀯錛 濡傚垪琛ㄣ佸厓緇勩侀泦鍚堝拰瀛

鍏革紝姣忎竴縐嶇粨鏋勯兘鏈夎嚜宸辯殑鐗圭偣鍜屾ц兘銆備負涓涓鐗瑰畾鐨勭敤渚嬮夋嫨

鏈鍚堥傜殑鏁版嵁緇撴瀯鍙浠ユ瀬澶у湴浼樺寲浠g爜鎵ц屻傝繖閲屾湁涓涓紺轟緥錛

鍦ㄦょず渚嬩腑錛屾瘮杈冧簡涓ょ嶆柟娉曟潵鍒涘緩涓涓浠0鍒9999鐨勬暟瀛楀垪琛

銆傜涓縐嶆柟娉曟槸鍦ㄤ竴涓寰鐜涓浣跨敤鍒楄〃榪炴帴錛岀敱浜庢瘡嬈¤凱浠i兘瑕

鍒涘緩鏂扮殑鍒楄〃錛屾墍浠ヤ細瀵艱嚧鎬ц兘涓嶄匠銆傜浜岀嶆柟娉曚嬌鐢ㄥ垪琛ㄧ悊瑙

錛岃繖縐嶆柟娉曟洿鏈夋晥錛屾洿浼樺寲銆

3.鍒╃敤鍐呯疆鐨勫嚱鏁板拰搴

Python鎻愪緵浜嗕竴濂椾赴瀵岀殑鍐呯疆鍑芥暟鍜屽簱錛 榪欎簺鍑芥暟鍜屽簱閮芥槸緇

榪囨ц兘浼樺寲鐨勩備嬌鐢ㄨ繖浜涘唴緗鍑芥暟鍜屽簱鍙浠ュぇ澶ф彁鍗嘝ython浠

鐮佺殑鎬ц兘銆傝繖閲屾湁涓涓紺轟緥錛

鍦ㄦょず渚嬩腑錛屾瘮杈冧簡涓ょ嶅逛竴涓鏁板瓧鍒楄〃榪涜屾帓搴忕殑鏂規硶銆傜涓

縐嶆柟娉曚嬌鐢ㄤ竴涓鑷瀹氫箟鐨勬瘮杈冨嚱鏁幫紝 鐢變簬lambda鍑芥暟鐨勪嬌鐢錛

瀹冪殑閫熷害浼氭瘮杈冩參銆傜浜岀嶆柟娉曞皢鍏跺垹闄わ紝 浣跨敤甯︽湁榛樿key鍙

鏁扮殑sorted鍑芥暟錛 榪欑嶆柟娉曠粡榪囦紭鍖栵紝 鏁堢巼鏇撮珮銆

4.鍒╃敤鍗蟲椂緙栬瘧(JIT)

緙栬瘧鍣↗ust-In-Time(JIT) 緙栬瘧鏄涓縐嶅彲浠ュ湪榪愯屾椂鍔ㄦ佷紭鍖

鍜岀紪璇戦儴鍒嗕唬鐮佷互鎻愰珮鍏舵ц兘鐨勬妧鏈銆侾ython鎻愪緵浜咼IT緙栬瘧搴

錛 濡侾yPy鍜孨umba錛 鍙浠ョ敤鏉ヤ紭鍖栨ц兘鍏抽敭鐨勪唬鐮併傜湅涓嬮潰

鐨勭ず渚嬶細

鍦ㄦょず渚嬩腑錛 浣跨敤numba搴撳逛竴涓璁$畻鏂愭嘗閭e戞暟鍒楃殑閫掑綊鍑

鏁拌繘琛屼簡JIT緙栬瘧銆侸IT緙栬瘧鍦ㄨ繍琛屾椂浼樺寲浜嗚ュ嚱鏁幫紝 涓庨潪浼樺寲鐗

鏈鐩告瘮錛屾ц兘寰楀埌浜嗘彁楂樸

5.綆$悊鍐呭瓨浠ュ疄鐜版ц兘浼樺寲

鏈夋晥鐨勫唴瀛樼$悊鍙浠ユ瀬澶у湴褰卞搷Python浠g爜鐨勬ц兘銆傝稿傚唴瀛

鍒嗘瀽銆佸瀮鍦炬敹闆嗗拰鍏鋒湁鍐呭瓨楂樻晥鐨勬暟鎹緇撴瀯絳夋妧鏈鍙浠ョ敤鏉ヤ紭鍖

鍐呭瓨鐨勪嬌鐢ㄥ苟鍑忓皯鍗犵敤銆傝繖閲屾湁涓涓紺轟緥錛

鍦ㄦょず渚嬩腑錛 姣旇緝浜嗕袱縐嶄嬌鐢∟umPy瀵逛袱涓澶ф暟緇勮繘琛屼箻娉曠殑

鏂規硶銆傜涓縐嶆柟娉曟槸浣跨敤甯歌勭殑鏁扮粍涔樻硶錛屽畠鍒涘緩浜嗕腑闂存暟緇勶紝

鍙鑳戒細瀵艱嚧浣庢晥鐨勫唴瀛樹嬌鐢ㄣ傜浜岀嶆柟娉曚嬌鐢ㄨ嗗浘鍜屽箍鎾鏉ヤ紭鍖

鍐呭瓨浣跨敤騫跺噺灝戝崰鐢ㄣ

『肆』 為什麼在使用vs2010時編譯c++程序時候速度特別慢,而以前用vc6時快得多

兩個方法:
1.在工程下按Alt+F7打開Properties

1.1
在General里whole program optimization,將選項調整到use link time code generation

1.2
在C/C++選項卡下的general把multi-processor compilation設置為YES

『伍』 Java鍜孋/C 緙栬瘧鍣ㄦ帹鑽

鎺ㄨ崘浣跨敤Eclipse鍜孖ntelliJ IDEA銆丟CC鍜孋lang銆


Eclipse鏄涓嬈懼箍娉涗嬌鐢ㄧ殑Java闆嗘垚寮鍙戠幆澧冿紙IDE錛夛紝瀹冨叿鏈夊己澶х殑緙栬瘧鍜岃皟璇曞姛鑳斤紝浠ュ強瀵笿ava璇璦鐗規х殑鑹濂芥敮鎸併侲clipse鎷ユ湁涓板瘜鐨勬彃浠剁敓鎬佺郴緇燂紝鍙浠ユ牴鎹闇瑕佽繘琛屽畾鍒跺拰鎵╁睍銆傚洜姝わ紝鏃犺烘槸鍒濆﹁呰繕鏄緇忛獙涓板瘜鐨勫紑鍙戣咃紝Eclipse閮芥槸涓涓鍊煎緱鎺ㄨ崘鐨凧ava緙栬瘧鍣ㄣ


IntelliJ IDEA鏄涓嬈懼姛鑳藉己澶х殑Java IDE錛屾彁渚涗簡鏅鴻兘浠g爜緙栬緫銆侀噸鏋勩佽皟璇曞拰鍒嗘瀽絳夊姛鑳姐傚畠鍏鋒湁鍑鴻壊鐨勬櫤鑳芥彁紺哄拰浠g爜瀹屾垚鍔熻兘錛岃兘澶熸彁鍗囩紪鐮佹晥鐜囥侷ntelliJ IDEA榪橀泦鎴愪簡璁稿氱幇浠e寲寮鍙戝伐鍏鳳紝濡傜増鏈鎺у埗鍜屾祴璇曟嗘灦錛屼嬌寰楀畠鎴愪負涓嬈鵑潪甯稿叏闈㈢殑Java緙栬瘧鍣ㄣ


GCC錛圙NU Compiler Collection錛夋槸涓嬈懼箍娉涗嬌鐢ㄧ殑寮婧怌/C++緙栬瘧鍣錛屾敮鎸佸氱嶅鉤鍙板拰鎿嶄綔緋葷粺銆侴CC鍏鋒湁浼樼鐨勪紭鍖栧姛鑳藉拰涓板瘜鐨勮瘖鏂淇℃伅錛岃兘澶熷府鍔╁紑鍙戣呮彁鍗囦唬鐮佹ц兘騫跺畾浣嶉棶棰樸傛ゅ栵紝GCC榪樻敮鎸佽稿氭墿灞曞拰璇璦鐗規э紝浣垮緱瀹冩垚涓篊/C++寮鍙戣呯殑棣栭夌紪璇戝櫒銆


Clang鏄涓嬈劇幇浠e寲鐨凜/C++緙栬瘧鍣錛屼互鍏跺嚭鑹茬殑鎬ц兘鍜岄敊璇璇婃柇鑳藉姏鑰岄椈鍚嶃侰lang鍏鋒湁蹇閫熺殑緙栬瘧閫熷害鍜岀簿紜鐨勯敊璇鎻愮ず錛岃兘澶熸彁鍗囧紑鍙戞晥鐜囥傛ゅ栵紝Clang榪樻敮鎸佽稿氬厛榪涚殑璇璦鐗規у拰宸ュ叿閾撅紝浣垮緱瀹冩垚涓篊/C++寮鍙戣呯殑鍙︿竴涓浼樼閫夋嫨銆


緇間笂鎵榪幫紝閽堝笿ava鍜孋/C++緙栬瘧鍣ㄦ帹鑽愶紝鎴戝垎鍒鎺ㄨ崘浜咵clipse鍜孖ntelliJ IDEA浠ュ強GCC鍜孋lang銆傝繖浜涚紪璇戝櫒鍦ㄤ笉鍚岀殑鏂歸潰閮藉叿鏈変紭縐鐨勮〃鐜板拰鐗圭偣錛岃兘澶熸牴鎹寮鍙戣呯殑闇奼傚拰鍋忓ソ榪涜岄夋嫨銆

『陸』 哪種計算機語言的執行速度最快、哪種最慢為什麼

針對性調優過的匯編速度是最快的。所有的語言最終都到匯磨旅編 匯編再到機器語言。 語言編譯的時候都有優化,所以好的匯編是最快的。但是差的匯編也不少MSP430上的程序都有一個判斷執行15秒的。

程序設計語言中匯編語言速度最快,c語言效率最高,執行效率高。程序設計語言(ProgrammingLanguage):是一組用來定義計算機程序的語法規則。它是一種被標准化的交流技巧,用來向計算機發出指令。

一種計算機語言讓程序員能夠准確地定義計算機所需要使用的數據,並精確地定義在不同情況下所應當採取的行動。程序設計語言特點不同,適用領域也不同。


(6)c編譯速度優化擴展閱讀:

如今通用的編程語言有兩種形式:匯編語言和高級語言。匯編語言和機器語言實質是相同的,都是直接對硬巧游告件操作,只不過指令採用了英文縮寫的標識符,容易識別和記憶。源程序經匯編生成的可執行文件不僅比較小,而且執行速度很快。

高級語言是絕大多數編程者的選擇。和匯編語言相比,它不但將許多相關的機器指令合成為單條指令,並且去掉了與具體操作有關但與完成工作無關的細節,例如使用堆棧、寄存器等,這樣就大大簡化了程序中的指令。同時,由於省略了很多細節,編程者也就不需要有太多的專業知識。

參孝明考資料來源:網路-計算機語言

閱讀全文

與c編譯速度優化相關的資料

熱點內容
phpexif信息 瀏覽:540
單片機三位元組浮點數 瀏覽:754
命令與征服泰伯利亞戰爭下載 瀏覽:376
c窗口界面編程 瀏覽:21
hypermill編程能做模板嗎 瀏覽:780
計算機網路最經典的演算法 瀏覽:626
華為思科的配置命令 瀏覽:869
linux設置光碟啟動 瀏覽:359
程序員俱樂部注冊 瀏覽:17
洗潔精雞蛋盤解壓視頻 瀏覽:291
企業內網加密app 瀏覽:49
騰訊雲伺服器怎麼設置本地網路 瀏覽:623
日常程序員 瀏覽:513
哪個pe有bit加密功能 瀏覽:108
rust伺服器是用什麼ip 瀏覽:692
java隨機字元串生成 瀏覽:551
數碼寶貝編程人物 瀏覽:390
php多用戶建站系統 瀏覽:624
加密防盜地上栓價位 瀏覽:671
比澤爾壓縮機下載 瀏覽:421