Android性能優(yōu)化篇之計(jì)算性能優(yōu)化

image

引言

1. Android性能優(yōu)化篇之內(nèi)存優(yōu)化--內(nèi)存泄漏

2.Android性能優(yōu)化篇之內(nèi)存優(yōu)化--內(nèi)存優(yōu)化分析工具

3.Android性能優(yōu)化篇之UI渲染性能優(yōu)化

4.Android性能優(yōu)化篇之計(jì)算性能優(yōu)化

5.Android性能優(yōu)化篇之電量?jī)?yōu)化(1)——電量消耗分析

6.Android性能優(yōu)化篇之電量?jī)?yōu)化(2)

7.Android性能優(yōu)化篇之網(wǎng)絡(luò)優(yōu)化

8.Android性能優(yōu)化篇之Bitmap優(yōu)化

9.Android性能優(yōu)化篇之圖片壓縮優(yōu)化

10.Android性能優(yōu)化篇之多線程并發(fā)優(yōu)化

11.Android性能優(yōu)化篇之?dāng)?shù)據(jù)傳輸效率優(yōu)化

12.Android性能優(yōu)化篇之程序啟動(dòng)時(shí)間性能優(yōu)化

13.Android性能優(yōu)化篇之安裝包性能優(yōu)化

14.Android性能優(yōu)化篇之服務(wù)優(yōu)化

介紹

Android中的Java代碼會(huì)需要經(jīng)過(guò)編譯優(yōu)化再執(zhí)行的過(guò)程高帖。代碼的不同寫法會(huì)影響到Java編譯器的優(yōu)化效率捂寿。例如for循環(huán)的不同寫法就會(huì)對(duì)編譯器優(yōu)化這段代碼產(chǎn)生不同的效率唠椭,當(dāng)程序中包含大量這種可優(yōu)化的代碼的時(shí)候,運(yùn)算性能就會(huì)出現(xiàn)問(wèn)題绞蹦。想要知道如何優(yōu)化代碼的運(yùn)算性能就需要知道代碼在硬件層的執(zhí)行差異。

1.低效率函數(shù)

如果你寫了一段代碼,它的執(zhí)行效率比想象中的要差很多拳锚。我們需要知道有哪些因素有可能影響到這段代碼的執(zhí)行效率益楼。例如:比較兩個(gè)float數(shù)值大小的執(zhí)行時(shí)間是int數(shù)值的4倍左右猾漫。這是因?yàn)镃PU的運(yùn)算架構(gòu)導(dǎo)致的,如下圖所示:

image1.png

雖然現(xiàn)代的CPU架構(gòu)得到了很大的提升感凤,也許并不存在上面所示的那么大的差異悯周,但是這個(gè)例子說(shuō)明了代碼寫法上的差異會(huì)對(duì)運(yùn)算性能產(chǎn)生很大的影響。

通常來(lái)說(shuō)有兩類運(yùn)行效率差的情況:第1種是相對(duì)執(zhí)行時(shí)間長(zhǎng)的方法陪竿,我們可以很輕松的找到這些方法并做一定的優(yōu)化禽翼。第2種是執(zhí)行時(shí)間短,但是執(zhí)行頻次很高的方法族跛,因?yàn)閳?zhí)行次數(shù)多闰挡,累積效應(yīng)下就會(huì)對(duì)性能產(chǎn)生很大的影響。

修復(fù)這些細(xì)節(jié)效率問(wèn)題礁哄,需要使用Android SDK提供的工具解总,進(jìn)行仔細(xì)的測(cè)量,然后再進(jìn)行微調(diào)修復(fù)姐仅。

2.Traceview

前面已經(jīng)講過(guò)花枫,這里就不在介紹了。

3.計(jì)算性能優(yōu)化
(1).批處理與緩存

為了提升運(yùn)算性能掏膏,這里介紹2個(gè)非常重要的技術(shù):批處理與緩存
是在真正執(zhí)行運(yùn)算操作之前對(duì)數(shù)據(jù)進(jìn)行批量預(yù)處理劳翰,例如你需要有這樣一個(gè)方法,它的作用是查找某個(gè)值是否存在與于一堆數(shù)據(jù)中馒疹。假設(shè)一個(gè)前提佳簸,我們會(huì)先對(duì)數(shù)據(jù)做排序,然后使用二分查找法來(lái)判斷值是否存在颖变。我們先看第一種情況生均,下圖中存在著多次重復(fù)的排序操作。


image2.png

在上面的那種寫法下腥刹,如果數(shù)據(jù)的量級(jí)并不大的話马胧,應(yīng)該還可以接受,可是如果數(shù)據(jù)集非常大衔峰,就會(huì)有嚴(yán)重的效率問(wèn)題佩脊。那么我們看下改進(jìn)的寫法蛙粘,把排序的操作打包綁定只執(zhí)行一次:

image3.png

上面就是批處理的一種示例:把重復(fù)的操作拎出來(lái),打包只執(zhí)行一次威彰。
緩存相對(duì)比較簡(jiǎn)單出牧,就是把經(jīng)常處理的數(shù)據(jù)先緩存起來(lái),使用時(shí)直接獲取歇盼,但是要注意舔痕,當(dāng)代碼執(zhí)行完畢需要回收(當(dāng)然也可以使用weakRefrence)。

(2).主線程阻塞

為了確保應(yīng)用程序的高性能豹缀,每項(xiàng)功能都應(yīng)該盡可能高效地運(yùn)行赵讯。但是這些功能的執(zhí)行時(shí)間以及它們?cè)诖a中所處的位置也很重要,當(dāng)你首次啟動(dòng)一個(gè)Android應(yīng)用程序時(shí)耿眉,朱執(zhí)行線程就已經(jīng)創(chuàng)建了边翼,主線程非常重要,因?yàn)樗?fù)責(zé)運(yùn)行你的代碼鸣剪,并在合適的視圖位置發(fā)送事件和執(zhí)行繪圖功能组底。這些前面我們已經(jīng)講過(guò),基本上來(lái)說(shuō)筐骇,主線程是應(yīng)用程序所在的線程债鸡,有時(shí)候,主線程也稱為UI線程铛纬。例如厌均,如果你觸摸屏幕上的按鈕,UI線程將會(huì)發(fā)送一個(gè)觸摸事件給視圖告唆,視圖將按鈕狀態(tài)設(shè)定為已按下設(shè)定棺弊,然后向事件隊(duì)列發(fā)送一個(gè)有效請(qǐng)求,然后UI線程處理此請(qǐng)求擒悬,并通知按鈕將其本身繪制為已按下狀態(tài)模她。如果你有任何觸摸事件的處理代碼塊,將會(huì)在線程中執(zhí)行懂牧,這些觸摸處理所用的時(shí)間越長(zhǎng)侈净,線程的執(zhí)行時(shí)間就會(huì)越長(zhǎng),在繪圖功能執(zhí)行完之前僧凤,視圖將會(huì)更新顯示狀態(tài)畜侦,讓用戶能夠看到其狀態(tài),這里需要記住的是躯保,輸入處理代碼與渲染和更新代碼旋膳,共享這個(gè)線程的處理周期時(shí)間。


image4.png

這意味著吻氧,在觸摸事件處理溺忧,網(wǎng)絡(luò)訪問(wèn)或數(shù)據(jù)庫(kù)查詢等計(jì)算周期時(shí)間咏连,UI不會(huì)更新繪圖情竹,在簡(jiǎn)單的情況下已艰,渲染周期可能會(huì)延誤16毫秒左右序苏,而讓用戶感到延遲。但是歌溉,如果你暫停UI線程渲染超過(guò)5秒,用戶將會(huì)看到“應(yīng)用程序未響應(yīng)”對(duì)話框骑晶,并詢問(wèn)用戶是否會(huì)想要關(guān)閉你的應(yīng)用程序痛垛,這樣可能導(dǎo)致用戶停止使用。那你如何解決這個(gè)問(wèn)題桶蛔,你要找出不需要在主線程上執(zhí)行的功能匙头,也就是說(shuō),不需要等它們完成之后仔雷,才能執(zhí)行繪圖蹂析。你應(yīng)該將這個(gè)功能轉(zhuǎn)移到一個(gè)單獨(dú)的獨(dú)立線程,這個(gè)線程不會(huì)阻止UI線程碟婆。例如电抚,如果你按一下提交按鈕,以完成一個(gè)訂單竖共,然后編寫和發(fā)送確認(rèn)郵件蝙叛,
image5.png

這可以在單獨(dú)的線程上完成。Android有系列很好用的API公给,能夠簡(jiǎn)化這些工作借帘。

(3).異步任務(wù)

給耗時(shí)操作建立異步任務(wù),比如網(wǎng)絡(luò)請(qǐng)求淌铐,圖片處理等等姻蚓,任務(wù)完成通知主線程。

(4).容器性能

前面我們講過(guò)匣沼,一些類型的硬件可能會(huì)造成程序執(zhí)行速度較慢狰挡,還記得那個(gè)浮點(diǎn)分支問(wèn)題嗎?對(duì)于今天的硬件來(lái)說(shuō)释涛,這已經(jīng)不是問(wèn)題加叁。但是有一些問(wèn)題還是需要引起注意,比如說(shuō)唇撬,你所使用的編程語(yǔ)言的基本元素的效率它匕,以排序等基本算法為例,現(xiàn)在窖认,有很多的排序算法豫柬,對(duì)于不同的情況告希,它們各有優(yōu)劣,例如烧给,當(dāng)元素?cái)?shù)量少于一千或在大型已排序列表中尋找一個(gè)對(duì)象時(shí)燕偶,快速排序法通常比起冒泡排序法更快。一般情況下础嫡,最好的方法是二分查找算法指么,但是,當(dāng)在未排數(shù)組中尋找對(duì)象時(shí)情況變得完全不同榴鼎,不同于比較每一個(gè)對(duì)象以查找你想要的值伯诬。你可以使用一個(gè)哈希函數(shù)來(lái)立即找到它,這是現(xiàn)代計(jì)算機(jī)科學(xué)和數(shù)據(jù)結(jié)構(gòu)方面的基本知識(shí)巫财。

幸運(yùn)的是盗似,現(xiàn)代編程語(yǔ)言像Java等,為你提供了這些容器和算法平项,因此你不再需要自己反復(fù)地編寫Murmur3哈希函數(shù)和快速排序算法赫舒。但是你需要知道另外一些事情,在我多年的編程生涯中葵礼,一個(gè)經(jīng)常會(huì)影響項(xiàng)目性能的問(wèn)題号阿,是由于這些語(yǔ)言提供的容器對(duì)象的性能所引起的。這聽起來(lái)不可思議鸳粉!Java提供一個(gè)矢量類的實(shí)現(xiàn)扔涧,你可以任意push、pop届谈,添加和取消對(duì)象枯夜,為了獲得這種靈活性,它在內(nèi)部使用鏈?zhǔn)搅斜斫Y(jié)構(gòu)艰山,這種結(jié)構(gòu)具有一系列獨(dú)特的性能特性湖雹,在你操作這種列表時(shí),它的速度超級(jí)快曙搬,但是摔吏,當(dāng)你在其他位置進(jìn)行插入或刪除時(shí),它會(huì)消耗大量的時(shí)間纵装。我要說(shuō)的是征讲,底層系統(tǒng)提供的這些容器并不會(huì)考慮,你的程序?qū)?huì)如何實(shí)際使用它們橡娄,James Sutherland發(fā)表了一系列的基準(zhǔn)測(cè)試報(bào)告诗箍,他認(rèn)為,我們需要注意性能與功能之間的一些差異挽唉。例如滤祖,他發(fā)現(xiàn)Hashtable比HashMap大約快22%筷狼,具體視你如何使用這些容器而有所不同,我們需要思考的是匠童,你是否曾經(jīng)分析過(guò)你在代碼中使用的容器類埂材。你是否堅(jiān)信,你在代碼中使用的容器的實(shí)際運(yùn)行速度絕對(duì)是最快的俏让。一個(gè)好消息是楞遏,你可以使用Android中的MPI來(lái)剖析這些容器的性能茬暇。


image6.png
(5).數(shù)據(jù)結(jié)構(gòu)

創(chuàng)建應(yīng)用時(shí)首昔,容器中不恰當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)所造成的性能問(wèn)題,為此我們可以使用Android SDK中的工具糙俗,來(lái)識(shí)別不恰當(dāng)數(shù)據(jù)結(jié)構(gòu)帶來(lái)的性能問(wèn)題勒奇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市巧骚,隨后出現(xiàn)的幾起案子赊颠,更是在濱河造成了極大的恐慌,老刑警劉巖劈彪,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竣蹦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沧奴,警方通過(guò)查閱死者的電腦和手機(jī)痘括,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)滔吠,“玉大人纲菌,你說(shuō)我怎么就攤上這事〈粒” “怎么了翰舌?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)冬骚。 經(jīng)常有香客問(wèn)我椅贱,道長(zhǎng),這世上最難降的妖魔是什么只冻? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任庇麦,我火速辦了婚禮,結(jié)果婚禮上属愤,老公的妹妹穿的比我還像新娘女器。我一直安慰自己,他們只是感情好住诸,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布驾胆。 她就那樣靜靜地躺著涣澡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丧诺。 梳的紋絲不亂的頭發(fā)上入桂,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音驳阎,去河邊找鬼抗愁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呵晚,可吹牛的內(nèi)容都是我干的蜘腌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼饵隙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼撮珠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起金矛,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芯急,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后驶俊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娶耍,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年饼酿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榕酒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗜湃,死狀恐怖奈应,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情购披,我是刑警寧澤杖挣,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站刚陡,受9級(jí)特大地震影響惩妇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜筐乳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一歌殃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝙云,春花似錦氓皱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)股淡。三九已至,卻和暖如春廷区,著一層夾襖步出監(jiān)牢的瞬間唯灵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工隙轻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留埠帕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓玖绿,卻偏偏與公主長(zhǎng)得像敛瓷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子镰矿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評(píng)論 25 707
  • 紀(jì)念捧著手機(jī)秤标,空洞的看著那一條消息。頭頂上昏黃的燈照得紀(jì)念的臉色愈發(fā)悲涼宙刘〔越“呵,紀(jì)念悬包,別想了衙猪,他要結(jié)婚了〔冀”紀(jì)念抬...
    浮生菇?jīng)?/span>閱讀 2,774評(píng)論 0 0
  • 風(fēng)吹細(xì)雨無(wú)痕跡垫释,窗前明月無(wú)處覓 夜來(lái)思愁緒端酒,無(wú)處不在斟滿杯
    比牛哥閱讀 155評(píng)論 0 0
  • 做一次自己吧撑瞧, 僅僅一次就足夠了棵譬。 去到?jīng)]有去過(guò)的地方, 遇見沒(méi)有遇過(guò)的人预伺, 做些自己喜歡的事订咸。 做一次自己吧, ...
    Ribuprofen閱讀 175評(píng)論 0 3
  • 發(fā)燒后如何合理處理? ① 手腳涼:泡腳瞒御,把腳心.手心.搓熱父叙。 ② 口渴?適量喝溫水,補(bǔ)充身體水份趾唱。 ③ 精神不好屿岂?...
    mz梅子閱讀 520評(píng)論 0 0