隨著Android NDK(本機(jī)開發(fā)套件)披露了許多的新設(shè)備和新功能,現(xiàn)在我們可以充分利用這些ARM設(shè)備了。下面列舉了一些快速提示,希望對(duì)您有所幫助。
1 - 關(guān)注目標(biāo)
最新的設(shè)備一般是ARMv7,這意味著它可以使用v7版本和功能。最新版的NDK增加了ARMv7和NEON代碼支持,可以實(shí)現(xiàn)關(guān)鍵循環(huán)操作和媒體操作優(yōu)化,遠(yuǎn)超其它方法。NDK提供小型靜態(tài)庫(kù),可以幫助您識(shí)別運(yùn)行時(shí)的選項(xiàng)。有關(guān)如何使用這些功能的示例,請(qǐng)參見NDK樣本目錄中的hello-neon示例項(xiàng)目。
v6是較舊的設(shè)備,但是NDK未提供專門支持,您需要自己選擇是安全地構(gòu)建v5TE還是冒險(xiǎn)嘗試可能是v5TE的設(shè)備。如果您對(duì)速度無甚要求,并清楚目標(biāo)硬件是什么,則可以嘗試構(gòu)建v6。盡管無法避免狂熱愛好者將新版的OS裝入舊硬件上,但事實(shí)是支持Android 2.0及以上版本的最新設(shè)備通常是基于ARMv7的。如果有選擇的話,最好專注于采用NEON實(shí)施方案的ARMv7。
2 - 不要倉(cāng)促優(yōu)化
除非您計(jì)劃移植現(xiàn)有的C++應(yīng)用程序,否則不要倉(cāng)促編譯本機(jī)代碼。首先確保應(yīng)用程序正確運(yùn)行并仔細(xì)地profiling配置。成為瓶頸的要素通常是您意想不到的。近期的手持設(shè)備都具有兩級(jí)緩存,有時(shí)還有用于節(jié)省電量的時(shí)鐘調(diào)度,再加上Google為了提高OS性能而付出的長(zhǎng)期努力,我們將會(huì)看到更多驚喜。
3 - 優(yōu)化,悄無聲息
不留痕跡。為了得到額外的運(yùn)行周期會(huì)誘使您打破設(shè)計(jì),但如非特殊情況,應(yīng)避免這樣。執(zhí)行優(yōu)化時(shí),輕輕進(jìn)入,迅速將應(yīng)用程序關(guān)鍵部分轉(zhuǎn)為本機(jī)或匯編代碼,然后不留痕跡地退出。這樣,您不用犧牲可維護(hù)性和調(diào)試便利性。當(dāng)然,如果您確定重新設(shè)計(jì)可以帶來足夠的速度且值得付出代價(jià),則可放手大干。
4 - 圍繞優(yōu)化實(shí)施重構(gòu)
設(shè)計(jì)完成后,務(wù)必重新排列代碼以使其更加適于優(yōu)化,但一旦本機(jī)代碼開始工作,則要避免修補(bǔ)過度。Java代碼更易重新排列和調(diào)試。通常應(yīng)先在Java層面優(yōu)化,以便讓邏輯塊接受本機(jī)代碼。在移植本機(jī)代碼時(shí),在Java層面改變算法或數(shù)據(jù)結(jié)構(gòu)更具優(yōu)勢(shì)且更易處理。
5 - 維護(hù)Java的異常處理
執(zhí)行不支持的本機(jī)代碼是個(gè)糟糕的主意;即使理想狀態(tài)下,它也可能造成應(yīng)用程序意外退出。開發(fā)人員可以大膽推測(cè)本機(jī)代碼是否與運(yùn)行程序的設(shè)備兼容,只要有Java實(shí)施方案,您可以隨時(shí)退回Java。這就是技巧4中優(yōu)化Java版本的好處所在。
6 - 小心的分配內(nèi)存
不論何時(shí),在Java中盡可能用Java來分配,而不要拖延到以后調(diào)用C函數(shù)來解圍。這樣才能最大程度地減少泄漏并使Java代碼保持簡(jiǎn)潔。如果有長(zhǎng)期操作,則應(yīng)在本地分配暫存空間,但請(qǐng)注意您的指針 - 編寫大量Java代碼時(shí),圍繞指針準(zhǔn)則的舊C語言習(xí)慣可能會(huì)忘得很快。
7 - 謹(jǐn)慎采用多線程
已經(jīng)有好幾個(gè)采用多ARM內(nèi)核的開發(fā)平臺(tái),客戶使用它們的速度可能比您想像的更快。這樣的想法會(huì)誘使您將所有任務(wù)都分割為多線程。總的來說這是個(gè)好主意,但切記,加重系統(tǒng)負(fù)載盡管能提升速度,也會(huì)犧牲用戶體驗(yàn)。當(dāng)然,巧妙使用線程非常地有效。Android系統(tǒng)自身會(huì)創(chuàng)建幾條線程去運(yùn)行一個(gè)應(yīng)用程序,然而它們一般都在等待事件,所以如果您自己創(chuàng)建太多活動(dòng)執(zhí)行線程,可能會(huì)削弱它們的運(yùn)行能力,適得其反地降低整體用戶體驗(yàn)。
8 - Java層的線程
如果將邏輯分為多個(gè)線程,應(yīng)盡可能通過Java執(zhí)行,而不要采用Pthreads。使用Java VM管理訪問可以降低風(fēng)險(xiǎn),且有更多的語言層工具。如果您擔(dān)心設(shè)置成本,采用現(xiàn)有的小型工人池應(yīng)該不會(huì)太困難。切記將長(zhǎng)期任務(wù)的更新發(fā)回到主UI線程,以確保用戶知悉。另外請(qǐng)牢記一條重要的Android NDK規(guī)則:不要在UI線程上運(yùn)行本機(jī)代碼。事實(shí)上,最好不在UI線程上運(yùn)行任何Java代碼;Android有相應(yīng)的API(請(qǐng)查看Handler類)可在非UI線程上經(jīng)濟(jì)運(yùn)行任務(wù)。
9 - 懂得何時(shí)使用匯編程序
C或C++可以立即帶來速度提升,而不需要編寫比Java要難以維護(hù)的代碼。也可通過將代碼關(guān)鍵部分轉(zhuǎn)換為匯編程序來實(shí)現(xiàn)進(jìn)一步提升,但需要在耗費(fèi)的時(shí)間、精力與最終受益之間做出權(quán)衡。最好先發(fā)布工作代碼,在以后發(fā)布快速升級(jí),而不是永無休止的調(diào)試。盡管如此,如果您十分清楚想要做什么,也許可以獲得更多性能。
切記要檢查發(fā)布出來的GCC,這一點(diǎn)至關(guān)重要。objdump是一款非常有用的工具,谷歌NDK下載目錄位于build/prebuilt/linux-x86/arm-eabi-4.4.0/arm-eabi/bin下提供了一種版本。
10 - 懂得如何使用NEON
NEON是一個(gè)非常強(qiáng)大的工具,在理想環(huán)境中,可給優(yōu)化匯編程序提供8倍的性能提升,但并不適用于所有環(huán)境。要了解如何充分利用NEON,請(qǐng)閱讀本博客中的NEON指南。
NEON加載和存儲(chǔ)處理遺留工作
Dave,ARM首席工程師,致力于虛擬機(jī)的維護(hù)、優(yōu)化、檢查至少十年,為硬件工程師解答有關(guān)虛擬機(jī)的問題。在Java領(lǐng)域經(jīng)營(yíng)多年后,他得以抽出時(shí)間研究工具,現(xiàn)在正著力于研究并理解Android。
本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。