CPU 和GPU
關(guān)于繪圖和動畫有兩種處理方式CPU(中央處理器)和GPU(圖形處理器),CPU的工作都在軟件層面,而GPU的在硬件層面。
總的來說,可以使用CPU做任何事情,但是對于圖像的處理,通常GPU會更快,因為GPU使用圖像對高度并行的浮點運算做了優(yōu)化,所以,我們想盡可能的把屏幕渲染的工作交給硬件去處理,而問題在于GPU并沒有無限制處理的性能,一旦資源用盡,即使CPU并沒有完全占用,GPU性能還是會下降。
所以,目前大多的性能優(yōu)化都是關(guān)于智能利用GPU和CPU,平衡它們之間工作負(fù)載。
Xcode自帶調(diào)試工具
Instruments
Instruments是Xcode套件中沒有被充分利用的工具,很多iOS開發(fā)者從來沒用過Instrument,很多面試官也會問性能條調(diào)優(yōu)方面的知識,來判斷大家到底擁有幾年開發(fā)經(jīng)驗。
打開instruments有兩種方式。一是通過open Developer tool打開,二是使用product選項的profile。


-
core animation
Core Animation工具是用來檢測Core Animation性能的,用來查看界面是否卡頓。在這里可以查看到刷新幀率和離屏渲染的效果。手機(jī)屏幕所顯示的內(nèi)容都是一個個點組成的。組成的屏幕上完整的一張圖片稱為一幀。幀率是指一秒鐘的時間內(nèi)重新繪制屏幕多少次。人眼的頻率是24,為了保證屏幕的流暢度,刷新幀率應(yīng)該在50+。在兩幀刷新運算沒有做完,讓用戶產(chǎn)生卡頓的感覺如果要提高性能,最關(guān)鍵的是要減少計算量。計算量減少了就能保證每一幀都完成計算,從而達(dá)到流暢的效果。

第一個調(diào)試選項"Color Blended Layers"正是用于檢測哪里發(fā)生了圖層混合,并用紅色標(biāo)記出來。因此我們需要盡可能減少看到的紅色區(qū)域。一旦發(fā)現(xiàn)應(yīng)該想法設(shè)法消除它。開始調(diào)試后勾選這個選項,
第二個調(diào)試選項是“Color Hits Green and Misses Red”,它表示如果命中緩存則顯示為綠色,否則顯示為紅色,顯然綠色越多越好,紅色越少越好。
第三、四個選項的使用場景不多,我們直接看一下第五個選項“Color Misaligned Images”。它表示如果圖片需要縮放則標(biāo)記為黃色,如果沒有像素對齊則標(biāo)記為紫色。
第六個選項“Color Offscreen-Rendered Yellow”會把需要離屏渲染的地方標(biāo)記為黃色,大部分情況下我們需要盡可能避免黃色的出現(xiàn)。離屏渲染可能會自動觸發(fā),也可以手動觸發(fā)。
- leaks
用來查看app運行期間,那些代碼產(chǎn)生內(nèi)存泄露。
內(nèi)存泄露 memory leak,是指程序在申請內(nèi)存后,無法釋放已申請的內(nèi)存空間。作為用戶,根本感覺不到內(nèi)存泄漏的存在。但內(nèi)存泄露堆積后果很嚴(yán)重,無論多少內(nèi)存,遲早會被占光。

點擊小紅點運行,如果在3區(qū)域有紅X出現(xiàn), 則有內(nèi)存泄露, 4區(qū)域則會顯示泄露的對象。打用leaks進(jìn)行監(jiān)測:點擊泄露對象可以在(下圖)看到它們的內(nèi)存地址, 占用字節(jié), 所屬框架和響應(yīng)方法等信息.打開擴(kuò)展視圖, 可以看到右邊的跟蹤堆棧信息,4 黑色代碼最有可能出現(xiàn)內(nèi)存泄漏的方法
- Time Profiler
在開發(fā)的過程中,我們經(jīng)常能感覺到,點擊某一按鈕,或者做了某一操作,會出現(xiàn)卡頓的現(xiàn)象,被稱為延遲。使用Time profile工具,就可以揪出耗時的函數(shù)。

選擇需要調(diào)試的項目,勾選安裝線程分割和隱藏系統(tǒng)的函數(shù)。就可以在下方查看相關(guān)的耗時操作,右鍵定位到耗時的方法,打開代碼就能很快解決問題。
Activity Monitor
類似于任務(wù)管理器,可以查看所有的進(jìn)程,以及進(jìn)程的內(nèi)存、cpu使用百分比等數(shù)據(jù)等
Allocations
管理內(nèi)存是app開發(fā)中最重要的一個方面,對于開發(fā)者來說,在程序架構(gòu)中減少內(nèi)存的使用通常都是使用Allocations去定位和找出減少內(nèi)存使用的方式。
面試題
問題一:
在開發(fā)中,如何去優(yōu)化tableview呢?
答:
行高一定要緩存: 行高方法其實被調(diào)用的次數(shù)非常多。通過緩存行高,可以減少大量計算自動布局的過程。
不要動態(tài)創(chuàng)建子視圖:當(dāng)cell顯示的時候,不要再去創(chuàng)建了。所有的自視圖都應(yīng)該預(yù)先創(chuàng)建,如果不需要顯示可以設(shè)置hidden。
所有的子視圖都必須制定背景顏色
所有的顏色都不要使用alpha:設(shè)置alpha會增加圖層的計算,對性能的消耗非常之大。
cell柵格化
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if(self){
//柵格化
self.layer.shouldRasterize = YES;
// 柵格化必須指定分辨率,否則默認(rèn)使用 *1 生成圖像
self.layer.raterizationScale = [UIScreen mainScreen].scale;
}
return self;
}
- 異步繪制
self.layer.drawsAsynchronously = YES;
問題二:
SDWebimage 在內(nèi)存方面存在很大的問題,如何解決動態(tài)圖片內(nèi)存不釋放的問題?
答:SDWebimage 在內(nèi)存方面存在很大的內(nèi)存問題,靜態(tài)的圖片也會出現(xiàn)拉伸問題,動態(tài)的gif圖內(nèi)存峰值更加的高,內(nèi)存釋放不會及時。
1、利用CADisplayLink開啟一個時鐘,每次觸發(fā)只加載一幀圖像!而之前的圖像立即釋放。
2、用加時鐘的方式來解決內(nèi)存過大的問題,會造成額外的開銷??梢詫討B(tài)圖片的加載換成YYAnimatedImageView。
問題三:
平時你是如何對代碼進(jìn)行性能優(yōu)化的呢?
答:利用性能分析工具檢測,使用instrument調(diào)試界面卡頓,timer Profiler用來看cpu的占比,core animation用來獲取圖形的繪制情況。使用靜態(tài)工具analyze分析代碼的聲明錯誤、邏輯錯誤、Api調(diào)用錯誤或內(nèi)存管理錯誤。
問題四:
如何對I/O進(jìn)行性能優(yōu)化?
答:將零碎的內(nèi)容作為一個整體進(jìn)行寫入;使用合適的 I/O 操作 API;使用合適的線程;使用 NSCache 做緩存達(dá)到減少 I/O操作的效果。
視頻地址: 性能優(yōu)化詳解
