特別鳴謝老大lunzi哥的分享。短短幾分鐘孽椰,感覺學(xué)到了很多昭娩!
這只是一篇方法論或者是個引子,性能優(yōu)化具體操作弄屡,請參考另外一篇文章
各種性能優(yōu)化方案
前言
項目代碼在隨著業(yè)務(wù)需求的不斷迭代和數(shù)據(jù)量不斷增加時题禀,原有代碼的邏輯處理方式在性能方面可能就跟不上要求了。要不就是處理時間過長膀捷,要不就是某些異常情況沒有考慮迈嘹,導(dǎo)致了一系列奇怪的問題。
性能優(yōu)化全庸,就是為了解決上述問題而想到的一個方案秀仲。我們可以分析性能可能發(fā)生異常的情況和借助一些工具,從而制定出對應(yīng)的優(yōu)化策略壶笼,讓程序得以優(yōu)化
性能瓶頸分類
具體的內(nèi)容直接寫出:
I/O開銷
- 網(wǎng)絡(luò)I/O
- 文件I/O
- 內(nèi)存I/O
計算
計算又可以分為
繪制/渲染
排版
具體細(xì)說
I/O相關(guān)
-
網(wǎng)絡(luò)
這一方面神僵,其實在客戶端可做的不多,因為覆劈,我們?nèi)绻5陌l(fā)送一個請求保礼,更多的耗時操作或者瓶頸出現(xiàn)在server端,高并發(fā)责语,多線程炮障,多表格查詢,都有可能導(dǎo)致server響應(yīng)速度增加坤候。
所以在通常情況下胁赢,網(wǎng)絡(luò)我們暫時不去考慮(因為需要考慮性價比和提升結(jié)果,一切以結(jié)果為出發(fā)點)
-
文件 和 內(nèi)存
-
內(nèi)存
在計算機(jī)中白筹,我們默認(rèn)內(nèi)存的操作速度是很快的智末,雖然其可緩存的數(shù)據(jù)相對文件操作來說相當(dāng)少谅摄,但也不影響其操作速度的快慢,所以系馆,我們正常去操作內(nèi)存IO送漠,也不會太過影響性能
-
文件
在IO這部分,最大頭的就是文件IO了由蘑。文件的讀寫螺男,保存或者查找,都是IO操作里最花費時間纵穿。所以如果想要優(yōu)化IO,從文件IO操作著手效益最高
相關(guān)的例子說明:
- 二進(jìn)制重排
- 多個framework的合并
- 減少項目中文件數(shù)量
都能提高相關(guān)的內(nèi)容
-
計算
繪制/渲染
- 緩存復(fù)用
- 視圖層級
最典型例子UITableView的tableviewcell緩存機(jī)制奢人,其初衷就是為了防止過多的cell視圖被創(chuàng)建谓媒,創(chuàng)建沒有什么,就是分配一個內(nèi)存地址何乎,但是view上的內(nèi)容繪制句惯、渲染,在從創(chuàng)建到獲得view對象之間支救,占比相對較大抢野。
還有一個不太恰當(dāng)?shù)睦樱弘x屏渲染。圓角觸發(fā)離屏渲染終究還是因為layer層太多視圖層級各墨,導(dǎo)致需要一層層解析處理渲染指孤,再統(tǒng)一合并渲染處理。
排版
解決方案:預(yù)排版
緩存cell高度就是最好的例子
最典型例子還是在UITableView的UITableViewDelegate方法heightForRowAtIndexPath
贬堵。此方法在創(chuàng)建并滑動的時候恃轩,會被多次調(diào)用。如果黎做,cell的高度每次都要通過計算獲得叉跛,那將大大降低滑動效率。這也是為什么UITableView會增加一個預(yù)估高度的屬性蒸殿,雖然有時候覺得很雞肋筷厘,且會影響頁面顯示(跳動什么的)。但也是為了減少應(yīng)要排版而引發(fā)計算的消耗宏所。
性能的具體體驗
時間
啟動時間也好酥艳,方法調(diào)用時間也好,視圖滾動耗時時間也好楣铁,都與時間有關(guān)玖雁。所以通過時間來判斷性能的好壞,是個不錯的選擇盖腕。
-
前提
前面所說赫冬,除網(wǎng)絡(luò)IO操作外浓镜,這個的大頭決定與server,客戶端沒有太多能力可以處理劲厌。所以時間計算時膛薛,需要剔除網(wǎng)絡(luò)請求帶來的影響
如滑動操作,1000條數(shù)據(jù)要滑動展示补鼻,最好先將這1000條數(shù)據(jù)內(nèi)容加載并緩存哄啄,然后剔除網(wǎng)絡(luò)的影響來測量,就能較為準(zhǔn)確的知道計算可能導(dǎo)致的時延問題风范。
-
工具
時間:instruments的time profiler就是很好的工具咨跌。
FPS:很多第三方庫可以選擇的。
## 其它內(nèi)容硼婿?
有些什么其他的耗電啊锌半,內(nèi)存泄漏啊,有些都是在特別明顯再處理(耗電)或者是代碼層面(規(guī)范編寫)在處理或者避免的寇漫。所以不算太大的優(yōu)化點刊殉。
當(dāng)然也是需要的,只是在必要時再做州胳,考慮投入產(chǎn)出比即可记焊。
方案的制定
優(yōu)化的大體方向已經(jīng)有了,那具體優(yōu)化細(xì)節(jié)點栓撞,該如何確定呢遍膜?
大體步驟:
- 現(xiàn)狀是啥?
- 問題點有哪些腐缤?每個問題點的可能影響占比是多少捌归?
- 針對占比大的問題,分析問題所屬類型岭粤,使用對應(yīng)類型解決辦法嘗試
- 優(yōu)化前優(yōu)化后結(jié)果對比惜索,輸出優(yōu)化結(jié)果。確定優(yōu)化成效
- 總結(jié)
最后還是感謝lunzi哥的分享內(nèi)容剃浇!醍醐灌頂