程式設計師面試閃充 -- 效能優化

weixin_34236869發表於2018-02-06

CPU 和GPU

關於繪圖和動畫有兩種處理方式CPU(中央處理器)和GPU(圖形處理器),CPU的工作都在軟體層面,而GPU的在硬體層面。
總的來說,可以使用CPU做任何事情,但是對於影像的處理,通常GPU會更快,因為GPU使用影像對高度並行的浮點運算做了優化,所以,我們想盡可能的把螢幕渲染的工作交給硬體去處理,而問題在於GPU並沒有無限制處理的效能,一旦資源用盡,即使CPU並沒有完全佔用,GPU效能還是會下降。
所以,目前大多的效能優化都是關於智慧利用GPU和CPU,平衡它們之間工作負載。

Xcode自帶除錯工具

Instruments

Instruments是Xcode套件中沒有被充分利用的工具,很多iOS開發者從來沒用過Instrument,很多面試官也會問效能條調優方面的知識,來判斷大家到底擁有幾年開發經驗。
開啟instruments有兩種方式。一是通過open Developer tool開啟,二是使用product選項的profile。


2237676-088fe6eb5fbcbd52.png
2237676-db7709a67f62aa66.png
  • core animation


    2237676-989408ed7e24e725.png

Core Animation工具是用來檢測Core Animation效能的,用來檢視介面是否卡頓。在這裡可以檢視到重新整理幀率和離屏渲染的效果。手機螢幕所顯示的內容都是一個個點組成的。組成的螢幕上完整的一張圖片稱為一幀。幀率是指一秒鐘的時間內重新繪製螢幕多少次。人眼的頻率是24,為了保證螢幕的流暢度,重新整理幀率應該在50+。在兩幀重新整理運算沒有做完,讓使用者產生卡頓的感覺如果要提高效能,最關鍵的是要減少計算量。計算量減少了就能保證每一幀都完成計算,從而達到流暢的效果。


2237676-c9dc0c063a1f2a42.png

第一個除錯選項"Color Blended Layers"正是用於檢測哪裡發生了圖層混合,並用紅色標記出來。因此我們需要儘可能減少看到的紅色區域。一旦發現應該想法設法消除它。開始除錯後勾選這個選項,

第二個除錯選項是“Color Hits Green and Misses Red”,它表示如果命中快取則顯示為綠色,否則顯示為紅色,顯然綠色越多越好,紅色越少越好。

第三、四個選項的使用場景不多,我們直接看一下第五個選項“Color Misaligned Images”。它表示如果圖片需要縮放則標記為黃色,如果沒有畫素對齊則標記為紫色。

第六個選項“Color Offscreen-Rendered Yellow”會把需要離屏渲染的地方標記為黃色,大部分情況下我們需要儘可能避免黃色的出現。離屏渲染可能會自動觸發,也可以手動觸發。

  • leaks

用來檢視app執行期間,那些程式碼產生記憶體洩露。
記憶體洩露 memory leak,是指程式在申請記憶體後,無法釋放已申請的記憶體空間。作為使用者,根本感覺不到記憶體洩漏的存在。但記憶體洩露堆積後果很嚴重,無論多少記憶體,遲早會被佔光。


2237676-e062fdf4624de864.png

點選小紅點執行,如果在3區域有紅X出現, 則有記憶體洩露, 4區域則會顯示洩露的物件。打用leaks進行監測:點選洩露物件可以在(下圖)看到它們的記憶體地址, 佔用位元組, 所屬框架和響應方法等資訊.開啟擴充套件檢視, 可以看到右邊的跟蹤堆疊資訊,4 黑色程式碼最有可能出現記憶體洩漏的方法

  • Time Profiler

在開發的過程中,我們經常能感覺到,點選某一按鈕,或者做了某一操作,會出現卡頓的現象,被稱為延遲。使用Time profile工具,就可以揪出耗時的函式。


2237676-89686b658f80bb21.png

選擇需要除錯的專案,勾選安裝執行緒分割和隱藏系統的函式。就可以在下方檢視相關的耗時操作,右鍵定位到耗時的方法,開啟程式碼就能很快解決問題。

Activity Monitor

類似於工作管理員,可以檢視所有的程式,以及程式的記憶體、cpu使用百分比等資料等

Allocations

管理記憶體是app開發中最重要的一個方面,對於開發者來說,在程式架構中減少記憶體的使用通常都是使用Allocations去定位和找出減少記憶體使用的方式。

面試題

問題一:
在開發中,如何去優化tableview呢?
答:

  • 行高一定要快取: 行高方法其實被呼叫的次數非常多。通過快取行高,可以減少大量計算自動佈局的過程。

  • 不要動態建立子檢視:當cell顯示的時候,不要再去建立了。所有的自檢視都應該預先建立,如果不需要顯示可以設定hidden。

  • 所有的子檢視都必須制定背景顏色

  • 所有的顏色都不要使用alpha:設定alpha會增加圖層的計算,對效能的消耗非常之大。

  • cell柵格化

-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    
    if(self){
        //柵格化
        self.layer.shouldRasterize = YES;
        // 柵格化必須指定解析度,否則預設使用 *1 生成影像
        self.layer.raterizationScale = [UIScreen mainScreen].scale;
    }
    return self;
}
  • 非同步繪製
self.layer.drawsAsynchronously = YES;

問題二:
SDWebimage 在記憶體方面存在很大的問題,如何解決動態圖片記憶體不釋放的問題?

答:SDWebimage 在記憶體方面存在很大的記憶體問題,靜態的圖片也會出現拉伸問題,動態的gif圖記憶體峰值更加的高,記憶體釋放不會及時。
1、利用CADisplayLink開啟一個時鐘,每次觸發只載入一幀影像!而之前的影像立即釋放。

2、用加時鐘的方式來解決記憶體過大的問題,會造成額外的開銷。可以將動態圖片的載入換成YYAnimatedImageView。

問題三:
平時你是如何對程式碼進行效能優化的呢?

答:利用效能分析工具檢測,使用instrument除錯介面卡頓,timer Profiler用來看cpu的佔比,core animation用來獲取圖形的繪製情況。使用靜態工具analyze分析程式碼的宣告錯誤、邏輯錯誤、Api呼叫錯誤或記憶體管理錯誤。

問題四:
如何對I/O進行效能優化?

答:將零碎的內容作為一個整體進行寫入;使用合適的 I/O 操作 API;使用合適的執行緒;使用 NSCache 做快取達到減少 I/O操作的效果。

視訊地址: 效能優化詳解

相關文章