性能優(yōu)化

本文為性能優(yōu)化系列的總綱荒适,主要介紹性能調(diào)優(yōu)專題計(jì)劃梨熙、何為性能問題、性能調(diào)優(yōu)方式及前面介紹的數(shù)據(jù)庫優(yōu)化刀诬、布局優(yōu)化咽扇、Java(Android)代碼優(yōu)化、網(wǎng)絡(luò)優(yōu)化具體對(duì)應(yīng)的調(diào)優(yōu)方式。

性能優(yōu)化實(shí)例

1质欲、降低執(zhí)行時(shí)間

這部分包括:緩存树埠、數(shù)據(jù)存儲(chǔ)優(yōu)化、算法優(yōu)化嘶伟、JNI怎憋、邏輯優(yōu)化、需求優(yōu)化幾種優(yōu)化方式九昧。

(1). 緩存

緩存主要包括對(duì)象緩存绊袋、IO緩存、網(wǎng)絡(luò)緩存铸鹰、DB緩存癌别,對(duì)象緩存能減少內(nèi)存的分配,IO緩存減少磁盤的讀寫次數(shù)掉奄,網(wǎng)絡(luò)緩存減少網(wǎng)絡(luò)傳輸规个,DB緩存較少Database的訪問次數(shù)。

在內(nèi)存姓建、文件、數(shù)據(jù)庫缤苫、網(wǎng)絡(luò)的讀寫速度中速兔,內(nèi)存都是最優(yōu)的,且速度數(shù)量級(jí)差別活玲,所以盡量將需要頻繁訪問或訪問一次消耗較大的數(shù)據(jù)存儲(chǔ)在緩存中涣狗。

Android中常使用緩存:

a.線程池

b.Android圖片緩存Android圖片Sdcard緩存舒憾,數(shù)據(jù)預(yù)取緩存

c. 消息緩存

通過handler.obtainMessage復(fù)用之前的message镀钓,如下:

handler.sendMessage(handler.obtainMessage(0,object));

d.ListView緩存

e.網(wǎng)絡(luò)緩存

數(shù)據(jù)庫緩存http response,根據(jù)http頭信息中的Cache-Control域確定緩存過期時(shí)間镀迂。

f. 文件IO緩存

使用具有緩存策略的輸入流丁溅,BufferedInputStream替代InputStream,BufferedReader替代Reader探遵,BufferedReader替代BufferedInputStream.對(duì)文件窟赏、網(wǎng)絡(luò)IO皆適用。

g.layout緩存

h. 其他需要頻繁訪問或訪問一次消耗較大的數(shù)據(jù)緩存

(2). 數(shù)據(jù)存儲(chǔ)優(yōu)化

包括數(shù)據(jù)類型箱季、數(shù)據(jù)結(jié)構(gòu)的選擇涯穷。

a. 數(shù)據(jù)類型選擇

字符串拼接用StringBuilder代替String,在非并發(fā)情況下用StringBuilder代替StringBuffer藏雏。如果你對(duì)字符串的長(zhǎng)度有大致了解拷况,如100字符左右,可以直接new StringBuilder(128)指定初始大小,減少空間不夠時(shí)的再次分配赚瘦。

64位類型如long double的處理比32位如int慢

使用SoftReference粟誓、WeakReference相對(duì)正常的強(qiáng)應(yīng)用來說更有利于系統(tǒng)垃圾回收

final類型存儲(chǔ)在常量區(qū)中讀取效率更高

LocalBroadcastManager代替普通BroadcastReceiver,效率和安全性都更高

b. 數(shù)據(jù)結(jié)構(gòu)選擇

常見的數(shù)據(jù)結(jié)構(gòu)選擇如:

ArrayList和LinkedList的選擇蚤告,ArrayList根據(jù)index取值更快努酸,LinkedList更占內(nèi)存、隨機(jī)插入刪除更快速杜恰、擴(kuò)容效率更高获诈。一般推薦ArrayList。

ArrayList心褐、HashMap舔涎、LinkedHashMap、HashSet的選擇逗爹,hash系列數(shù)據(jù)結(jié)構(gòu)查詢速度更優(yōu)亡嫌,ArrayList存儲(chǔ)有序元素,HashMap為鍵值對(duì)數(shù)據(jù)結(jié)構(gòu)掘而,LinkedHashMap可以記住加入次序的hashMap挟冠,HashSet不允許重復(fù)元素。

HashMap袍睡、WeakHashMap選擇知染,WeakHashMap中元素可在適當(dāng)時(shí)候被系統(tǒng)垃圾回收器自動(dòng)回收,所以適合在內(nèi)存緊張型中使用斑胜。

Collections.synchronizedMap和ConcurrentHashMap的選擇控淡,ConcurrentHashMap為細(xì)分鎖,鎖粒度更小止潘,并發(fā)性能更優(yōu)掺炭。Collections.synchronizedMap為對(duì)象鎖,自己添加函數(shù)進(jìn)行鎖控制更方便凭戴。

Android也提供了一些性能更優(yōu)的數(shù)據(jù)類型,如SparseArray簇宽、SparseBooleanArray勋篓、SparseIntArray、Pair魏割。

Sparse系列的數(shù)據(jù)結(jié)構(gòu)是為key為int情況的特殊處理譬嚣,采用二分查找及簡(jiǎn)單的數(shù)組存儲(chǔ),加上不需要泛型轉(zhuǎn)換的開銷钞它,相對(duì)Map來說性能更優(yōu)拜银。不過我不太明白為啥默認(rèn)的容量大小是10殊鞭,是做過數(shù)據(jù)統(tǒng)計(jì)嗎,還是說現(xiàn)在的內(nèi)存優(yōu)化不需要考慮這些東西尼桶,寫16會(huì)死嗎操灿,還是建議大家根據(jù)自己可能的容量設(shè)置初始值。

(3). 算法優(yōu)化

這個(gè)主題比較大泵督,需要具體問題具體分析迄埃,盡量不用O(n*n)時(shí)間復(fù)雜度以上的算法蜗帜,必要時(shí)候可用空間換時(shí)間。

查詢考慮hash和二分,盡量不用遞歸驹马∶湓酰可以從結(jié)構(gòu)之法 算法之道微軟爆阶、Google等面試題學(xué)習(xí)沃测。

(4). JNI

Android應(yīng)用程序大都通過Java開發(fā),需要Dalvik的JIT編譯器將Java字節(jié)碼轉(zhuǎn)換成本地代碼運(yùn)行入问,而本地代碼可以直接由設(shè)備管理器直接執(zhí)行丹锹,節(jié)省了中間步驟,所以執(zhí)行速度更快芬失。不過需要注意從Java空間切換到本地空間需要開銷楣黍,同時(shí)JIT編譯器也能生成優(yōu)化的本地代碼,所以糟糕的本地代碼不一定性能更優(yōu)棱烂。

這個(gè)優(yōu)化點(diǎn)會(huì)在后面單獨(dú)用一片博客介紹锡凝。

(5). 邏輯優(yōu)化

這個(gè)不同于算法,主要是理清程序邏輯垢啼,減少不必要的操作。

(6). 需求優(yōu)化

這個(gè)就不說了张肾,對(duì)于sb的需求可能帶來的性能問題芭析,只能說做為一個(gè)合格的程序員不能只是執(zhí)行者,要學(xué)會(huì)說NO吞瞪。不過不能拿這種接口敷衍產(chǎn)品經(jīng)理哦馁启。

2、異步芍秆,利用多線程提高TPS

充分利用多核Cpu優(yōu)勢(shì)惯疙,利用線程解決密集型計(jì)算、IO妖啥、網(wǎng)絡(luò)等操作霉颠。

關(guān)于多線程可參考:Java線程池

在Android應(yīng)用程序中由于系統(tǒng)ANR的限制,將可能造成主線程超時(shí)操作放入另外的工作線程中荆虱。在工作線程中可以通過handler和主線程交互蒿偎。

3朽们、提前或延遲操作,錯(cuò)開時(shí)間段提高TPS

(1) 延遲操作

不在Activity诉位、Service骑脱、BroadcastReceiver的生命周期等對(duì)響應(yīng)時(shí)間敏感函數(shù)中執(zhí)行耗時(shí)操作,可適當(dāng)delay苍糠。

Java中延遲操作可使用ScheduledExecutorService叁丧,不推薦使用Timer.schedule;

Android中除了支持ScheduledExecutorService之外,還有一些delay操作岳瞭,如

handler.postDelayed拥娄,handler.postAtTime,handler.sendMessageDelayed寝优,View.postDelayed条舔,AlarmManager定時(shí)等。

(2) 提前操作

對(duì)于第一次調(diào)用較耗時(shí)操作乏矾,可統(tǒng)一放到初始化中孟抗,將耗時(shí)提前。如得到壁紙wallpaperManager.getDrawable();

4钻心、網(wǎng)絡(luò)優(yōu)化

更多見性能優(yōu)化第四篇——移動(dòng)網(wǎng)絡(luò)優(yōu)化

以下是網(wǎng)絡(luò)優(yōu)化中一些客戶端和服務(wù)器端需要盡量遵守的準(zhǔn)則:

a. 圖片必須緩存凄硼,最好根據(jù)機(jī)型做圖片做圖片適配

b. 所有http請(qǐng)求必須添加httptimeout

c. 開啟gzip壓縮

d. api接口數(shù)據(jù)以json格式返回,而不是xml或html

e. 根據(jù)http頭信息中的Cache-Control及expires域確定是否緩存請(qǐng)求結(jié)果捷沸。

f. 確定網(wǎng)絡(luò)請(qǐng)求的connection是否keep-alive

g. 減少網(wǎng)絡(luò)請(qǐng)求次數(shù)摊沉,服務(wù)器端適當(dāng)做請(qǐng)求合并。

h. 減少重定向次數(shù)

i. api接口服務(wù)器端響應(yīng)時(shí)間不超過100ms

google正在做將移動(dòng)端網(wǎng)頁速度降至1秒的項(xiàng)目痒给,關(guān)注中https://developers.google.com/speed/docs/insights/mobile

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末说墨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子苍柏,更是在濱河造成了極大的恐慌尼斧,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件试吁,死亡現(xiàn)場(chǎng)離奇詭異棺棵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)熄捍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門烛恤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人余耽,你說我怎么就攤上這事缚柏。” “怎么了宾添?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵船惨,是天一觀的道長(zhǎng)柜裸。 經(jīng)常有香客問我,道長(zhǎng)粱锐,這世上最難降的妖魔是什么疙挺? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮怜浅,結(jié)果婚禮上铐然,老公的妹妹穿的比我還像新娘。我一直安慰自己恶座,他們只是感情好搀暑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跨琳,像睡著了一般自点。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脉让,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天桂敛,我揣著相機(jī)與錄音,去河邊找鬼溅潜。 笑死术唬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滚澜。 我是一名探鬼主播粗仓,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼设捐!你這毒婦竟也來了借浊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤萝招,失蹤者是張志新(化名)和其女友劉穎巴碗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體即寒,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年召噩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了母赵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡具滴,死狀恐怖凹嘲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情构韵,我是刑警寧澤周蹭,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布趋艘,位于F島的核電站,受9級(jí)特大地震影響凶朗,放射性物質(zhì)發(fā)生泄漏瓷胧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一棚愤、第九天 我趴在偏房一處隱蔽的房頂上張望搓萧。 院中可真熱鬧,春花似錦宛畦、人聲如沸瘸洛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽反肋。三九已至,卻和暖如春踏施,著一層夾襖步出監(jiān)牢的瞬間石蔗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工读规, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抓督,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓束亏,卻偏偏與公主長(zhǎng)得像铃在,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碍遍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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