clang編譯吃多核性能嗎
① 編譯llvm和clang需要多大空間
:轉自知乎 藍色 我最近和Clang/LLVM打交道比較多,目前游離在LLVM IR和IBM WCode之間。對於學習Clang/LLVM來說,其實需要看你做什麼,是研究C, C++, Objective-C在Clang的實現,抑或著是想利用Clang做AST層面的事情,還是說想要利用LLVM IR來做
② 綜合來說,幾大主流C++編譯器(icc,gcc,clang,vc++等)究竟孰優孰劣
我曾編出各種C++ 11編譯器的支持,並有C++ 14編譯器支持一批。
實際使用
對VC編譯的速度不斷提高,內存佔用已經從VC12開始明顯提高,而最明顯的是可變參數模板。還有內置的代碼靜態分析,在實際中很有用。32位保護模式下,ss寄存器存的是一個段選擇子,選擇子是一個數字,通過IDT(局部描述符表)或者GDT(全局描述符表)選擇一個段描述符,描述符裡面的信息包含該段的取值范圍和大小。
vc14的靜態分析不在每次載入一個ie(對,以前每分析一個.cpp,就載入一次ie!),速度快了相當多。
③ GCC/G++,ICC,Clang,MSVC,BCC等C/C++編譯器有什麼特長和不足
clang編譯速度快,但是貌似編譯結果運行相對會慢。功能更新一般也比較快。
g++編譯速度比clang慢,編譯結果運行貌似比clang快。功能更新稍慢。
vc這幾年沒編譯過大工程,感覺上編譯速度在clang和g++之間。以過去的經驗g++和vc編譯結果運行速度差不多。功能更新上就是一坨屎。但是在Windows上寫點正經東西你可能不得不用它,相對的你也只能在Windows上用它。
icc很久沒用過,過去印象編譯速度很慢,運行速度最快但是感覺有點得不償失。最大的問題是這東西要錢,前三個都是免費的。
bcc直接無視就好了。
④ Clang 比 GCC 編譯器好在哪裡
編譯速度更快、編譯產出更小、出錯提示更友好。尤其是在比較極端的情況下。
兩年多前曾經寫過一個Scheme解釋器,詞法分析和語法解析部分大約2000行,用的是Boost.Spirit——一個重度依賴C++模版元編程的框架。當時攔姿孝用g++ 4.2編譯的情況是:
1.編譯速度極慢:完整編譯一次需要20分鍾
2.編譯過程中內存消耗極大:單個g++實例內存峰值消耗超過1G
3.中間產出物極大:編譯出的所有.o文件加在一起大約1~2G,debug鏈接產物超過200M
4.編譯錯誤極其難以理解:編譯錯誤經常長達幾十K,基本不可讀,最要命的是編譯錯誤經常會長到被g++截斷,看不到真正出錯的位置,基本上只能靠裸看代碼來調試
這里先不論我使用Spirit的方式是不是有問題,或者Spirit框架自身的問題。我當時因為實在忍受不了g++,轉而嘗試clang。當時用的是clang 2.8,剛剛可以完整編譯Boost,效果讓我很滿意:
1.編譯速度有顯著提升,記得大約是g++的1/3或1/4
2.編譯過程中的內存消耗差別好像不大
3.中間產出物及最終鏈接產物,記得也是g++的1/3或1/4
4.相較於g++,編譯錯誤可讀性有所飛躍,至少不會出現編譯錯誤過長被截斷的問題了
當時最大的缺點是clang編譯出的可執行文件無法用gdb調試,需要用調試器的時候還得用g++再編譯一遍。不過這個問題後來解決了,我不知道是clang支持了gdb還是gdb支持了clang。至少我當前在Ubuntu下用clang 3.0編譯出的二進制文件已經可以順利用gdb調試了冊羨。
最後一點,其他同學也有講到,就是Clang採用的簡稿是BSD協議。這是蘋果資助LLVM、FreeBSD淘汰GCC換用Clang的一個重要原因。
⑤ xcode在用clang編譯cairo庫的時候出現的error和warning
cairo-quartz-font.c:789:26: error: implicit declaration of function
'FMGetATSFontRefFromFont' is invalid in C99
[-Werror,-Wimplicit-function-declaration]
ATSFontRef atsFont = FMGetATSFontRefFromFont (font_id);
^
cairo-quartz-font.c:790:24: warning: 'CGFontCreateWithPlatformFont' is
deprecated: first deprecated in OS X 10.6 [-Wdeprecated-declarations]
CGFontRef cgFont = CGFontCreateWithPlatformFont (&atsFont);
⑥ 如何加快xcode編譯速度
1. 增加XCode執行的線程數
可以根據自己Mac的性能,更改線程數設置5:defaults write com.apple.Xcode 5
另外也有一個設置可以開啟:defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
XCode默認使用與CPU核數相同的線程來進行編譯,但由於編譯過程中的IO操作往往比CPU運算要多,因此適當的提升線程數可以在一定程度上加快編譯速度。
2.將Debug Information Format改為DWARF
在工程對應Target的Build Settings中,找到Debug Information Format這一項,將Debug時的DWARF with dSYM file改為DWARF。
這一項設置的是是否將調試信息加入到可執行文件中,改為DWARF後,如果程序崩潰,將無法輸出崩潰位置對應的函數堆棧,但由於Debug模式下可以在XCode中查看調試信息,所以改為DWARF影響並不大。這一項更改完之後,可以大幅提升編譯速度。
比如在目前本人負責的項目中,由於依賴了多個Target,所以需要在每個Target的Debug Information Format設置為DWARF。順便提一下,如果通過Cocoapod引入第三方則Debug Information Format默認就是設置為DWARF的。
SDWebImage通過Cocoapod``Debug Information Format的默認設置
注意:將Debug Information Format改為DWARF之後,會導致在Debug窗口無法查看相關類類型的成員變數的值。當需要查看這些值時,可以將Debug Information Format改回DWARF with dSYM file,clean(必須)之後重新編譯即可。
3.將Build Active Architecture Only改為Yes
在工程對應Target的Build Settings中,找到Build Active Architecture Only這一項,將Debug時的NO改為Yes。
664334-fa1eb995c140ce0f.png
這一項設置的是是否僅編譯當前架構的版本,如果為NO,會編譯所有架構的版本。需要注意的是,此選項在Release模式下必須為NO`,否則發布的ipa在部分設備上將不能運行。這一項更改完之後,可以顯著提高編譯速度。
4.設計編譯優化等級
不要再項目中或者靜態庫中使用-O4,因為這會讓Clang鏈接Link Time Optimizations (LTO)使得編譯更慢,通常使用-O3。
注意:在設置編譯優化之後,XCode斷點和調試信息會不正常,所以一般靜態庫或者其他Target這樣設置。
4.資源整合
4.1 將常用的代碼及文件打包成靜態庫
4.2 添加預編譯文件,把常用的頭文件放到預編譯文件裡面
4.3 能用@class就用@class