隨著項目的進(jìn)行,APP的優(yōu)化必須要盡早的展開了,所以最近自己在學(xué)習(xí)很多APP的調(diào)試技巧,今天我們就來說說Xcode為我們準(zhǔn)備的自帶的調(diào)試工具。
代碼性能是個避不開的話題。隨著項目的擴(kuò)大和功能的增多,沒經(jīng)過認(rèn)真調(diào)試和優(yōu)化的代碼,要么任性地卡頓運行,要么低調(diào)地崩潰了之……結(jié)果呢,大家用著不高興,開發(fā)者也不開心。
本篇重點討論一下 iOS性能測試中的啟動測試、內(nèi)存泄露測試、CPU測試。
1.啟動測試
測試工具:Instruments > TimeProfile
可在 appDelegate.m中加入一段代碼,來進(jìn)行測試:
- (void)testLaunch
{
for(int i = 0; i < 100000;i++){
NSLog(@"test");
}
}
1)獲得啟動時間
APP啟動之后,中止 TimeProfile,按住 option鍵在監(jiān)控窗口中拖拽,選中監(jiān)控區(qū)域中起始點到打開 APP后的峰谷,查看APP啟動所需時間,如下圖:
2)分析可優(yōu)化空間
首先,需要注意一下右側(cè)欄中的幾個給力的篩選項,如下圖:
(注:我覺得非常常用的標(biāo)記為『必選項』)
- Separate by Thread //按線程聚類,『可選項』,當(dāng)我們想查看每個線程中哪些方法比較耗時時,勾選它;
- Invert Call Tree //反轉(zhuǎn)調(diào)用棧信息,『必選項』,否則 main一直排在最上面,礙事;
- Hide System Libraries //隱藏系統(tǒng)庫,『可選項』,只查看自己應(yīng)用的棧信息;
- Top Functions //按耗時降序排列,『必選項』
Running Time列中顯示運行每個方法所耗費的時間,根據(jù)耗時和占比猜測是否有代碼需要優(yōu)化。雙擊中間主窗口中的方法名進(jìn)入具體的代碼行查看,耗時多的代碼行有顏色標(biāo)記,并顯示占比。
獲取 APP啟動時間非常簡單,但分析哪些地方可以優(yōu)化,則需要對代碼足夠了解。項目的啟動時間沒有一個特定的值,利用該方法可以提供一個縮小的檢測范圍,盡可能發(fā)現(xiàn)可被優(yōu)化的代碼。
2.內(nèi)存泄露測試
有兩種方法可以采用,第一利用靜態(tài)分析,第二使用Instruments工具集。
1)靜態(tài)分析
在 xcode中長按運行按鈕>Analyze,可啟動代碼靜態(tài)分析。
對于 MRC項目,靜態(tài)分析是必要的,對于 ARC項目,靜態(tài)分析作為可選項。
這項檢查只覆蓋代碼編譯時可能存在的問題,但并不能覆蓋代碼運行時。這時,我們還需要結(jié)合動態(tài)分析工具。
2)動態(tài)分析
工具: Allocations,Leaks
【Allocation】
Allocations組件監(jiān)控對象調(diào)用了 alloc方法申請內(nèi)存后的內(nèi)存使用情況,可記錄對象生命周期中內(nèi)存引用計數(shù)的變化,當(dāng)對象被正常釋放后不再繼續(xù)追蹤。
【Leaks】
Leaks監(jiān)控內(nèi)存泄露,一般和 Allocations一起使用,在檢測到內(nèi)存泄露后,通過 Allocations定位到具體的代碼。發(fā)現(xiàn)問題時,監(jiān)控圖會顯示紅條。修改代碼后,再次查看,如果紅色消失則表示內(nèi)存泄露被修復(fù)成功了。
但 Leaks可能會『假摔』,例如每次 APP啟動后,都會顯示幾個紅條,因此 Leaks的使用過程中也需要人工判斷分析。
步驟:
a)運行Profile>Allocations,啟動 APP后實時查看 Allocations\Leaks圖,若 Leaks中出現(xiàn)紅條,則雙擊紅條,切換到 Leaks視圖;
b) 選擇右側(cè)欄查看 stack trace,點擊黑色圖標(biāo)(非系統(tǒng)類),查看具體的代碼實現(xiàn),分析可能出現(xiàn)的問題,如下圖:
例如,上面的代碼中,每次初始化都會創(chuàng)建一個NSMutableArray 對象,可以優(yōu)化為removeAllObject后重利用。
3)CPU等指標(biāo)
工具:Activity Monitor
可監(jiān)控 CPU和內(nèi)存指標(biāo),并可對比多次監(jiān)控的結(jié)果。
步驟:
a)profile>Activity Monitor 啟動 APP, 運行過程中option選擇峰值查看 cpu和內(nèi)存使用量。
b)對比多次監(jiān)控的結(jié)果,把最差情況作為最終結(jié)果;