以前在做Symbian的時(shí)候,曾經(jīng)研究過(guò)ARM CPU的指令集問(wèn)題,ARM處理器支持兩套指令集,即ARM和Thumb。ARM為32位指令集而Thumb為16位指令集,理論上32位可以提供更快的執行速度但會(huì )生成更大的二進(jìn)制執行文件,而16位的Thumb則恰恰相反,省地但慢,這也正是體現出了ARM對于嵌入式設備的專(zhuān)業(yè)性。對于我這種犧牲一切換速度的理念來(lái)說(shuō),當時(shí)就留下了ARM就比Thumb快的印象,以致于現在在做Android NDK原生開(kāi)發(fā)時(shí),也是優(yōu)先用ARM指令集。(這個(gè)可以通過(guò)在A(yíng)ndroid.mk中加入LOCAL_ARM_MODE := arm控制,默認情況下NDK使用Thumb指令集)
但是最近在Xcode編譯iOS項目時(shí),注意到同為ARM處理器的蘋(píng)果設備,使用的是Thumb指令集,而且好像還是某種新版本的Thumb指令集,小搜索了一下看到有人說(shuō)這種armv7引入的叫做Thumb-2的指令集要比arm指令集更好!于是又重新搜索更新了一下大腦知識庫…
armv7對于蘋(píng)果設備來(lái)說(shuō),意味著(zhù)iPhone 3GS以上級別的設備的CPU,而目前主流的Android設備幾乎全是armv7處理器的了。也許對于早起的armv6處理器來(lái)說(shuō),ARM指令集還有優(yōu)勢,但是對于新的v7處理器,各種資料都表明Thumb-2要更好一些。
總的來(lái)說(shuō),ARM指令集會(huì )在某些方面有優(yōu)勢,比如手寫(xiě)匯編(額…),而Thumb則能生成更精簡(jiǎn)的代碼,而且還有一點(diǎn)我之前沒(méi)有太意識到的問(wèn)題就是:省電!所以仔細斟酌后,我還是決定把NDK編譯選項由原來(lái)的ARM改回默認的Thumb,遵循默認原則吧還是。
而對于v7和非v7的問(wèn)題,Android上可以這樣處理,以略增大apk為代價(jià),加入單獨針對v7和非v7版的so文件,這樣apk在安裝時(shí)會(huì )自動(dòng)根據目標設備的CPU安裝合適的so庫,從而達到更好的效果,具體做法是在A(yíng)pplication.mk中加入”APP_ABI := armeabi armeabi-v7a"
另外,隨著(zhù)項目規模的增大,代碼編譯生成時(shí)間會(huì )大大增加,這時(shí)候可以考慮更換r8c版NDK新加入的Clang編譯器(蘋(píng)果家的編譯器,新版Xcode默認就用它),實(shí)測發(fā)現Clang比GCC明顯快很多,而且對于warning, error的顯示也比GCC要人性的多(有人說(shuō)GCC的提示就像是天書(shū),呵呵),不過(guò)據說(shuō)Clang也有一些不足,比如對于標準的支持不如GCC(這話(huà)怎么聽(tīng)著(zhù)像是說(shuō)MS的…),不如GCC支持的語(yǔ)言廣等,但感覺(jué)對于A(yíng)ndroid原生開(kāi)發(fā)來(lái)說(shuō)都是些無(wú)關(guān)緊要的事,我只要編譯快,運行快就好了!
改用Clang編譯器的方法如下:
對于ndk-build方式,可以使用“export NDK_TOOLCHAIN_VERSION=clang3.1”導出環(huán)境變量,或者將這個(gè)環(huán)境變量設置加入到Application.mk中。
對于獨立編譯方式,在make-standalone-toolchain.sh腳本中加入–llvm-version=3.1 并在makefile中用<tool-path>/bin/clang and <tool-path>/bin/clang++替換 CC 和CXX 參數。
PS:實(shí)際編譯時(shí)發(fā)現Clang好像對中文注釋支持不是特別好,比如有端代碼在if(…)后謝了//中文注釋?zhuān)瑢е戮幾g器處理至此處時(shí)直接報了異常,刪除注釋后就沒(méi)事了…
參考文章:
聯(lián)系客服