參考了chenkai 的簡書
本文總結(jié)了包括Time Profiler、leaks、Allocation本人認(rèn)為前兩者使用較多,最后的可僅供參考
Time Profiler的使用
作用:
應(yīng)用程序開始運(yùn)行后.就能獲取到整個(gè)應(yīng)用程序運(yùn)行消耗時(shí)間分布和百分比.
使用Time Profiler的注意事項(xiàng):
必須使用真機(jī),因?yàn)閙acbook上的cpu優(yōu)于iPhone;gpu劣于ipone;
time? profiler使用步驟
在xcode選擇 product--profile得到圖一界面,鐘表為
time profiler
點(diǎn)擊開始錄制按鈕得到如圖二:
可以看出圖中包含有調(diào)用系統(tǒng)API所消耗的時(shí)間,這些數(shù)據(jù)對我們來說是無用的,因此我們選擇屏蔽它
選用call tree的Separate Thread和Hide System Libraries得如圖三
可以看出剔除了反向調(diào)用樹和系統(tǒng)API調(diào)用的數(shù)據(jù)。此時(shí)點(diǎn)擊圖中所示方法,可直接跳轉(zhuǎn)至指定代碼,對耗時(shí)的代碼進(jìn)行優(yōu)化,一般耗時(shí)場景主要為UIImageView播放動畫、NSDateFormatter以及NSCalendar的使用等場景。
相關(guān)名詞注釋:
Separate By Thread:線程分離,只有這樣才能在調(diào)用路徑中能夠清晰看到占用CPU最大的線程.
Invert Call Tree:從上到下跟蹤堆棧信息.這個(gè)選項(xiàng)可以快捷的看到方法調(diào)用路徑最深方法占用CPU耗時(shí),比如FuncA{FunB{FunC}},勾選后堆棧以C->B->A把調(diào)用層級最深的C顯示最外面.
Hide Missing Symbols:如果dSYM無法找到你的APP或者調(diào)用系統(tǒng)框架的話,那么表中將看到調(diào)用方法名只能看到16進(jìn)制的數(shù)值,勾選這個(gè)選項(xiàng)則可以隱藏這些符號,便于簡化分析數(shù)據(jù).
Hide System Libraries:這個(gè)就更有用了,勾選后耗時(shí)調(diào)用路徑只會顯示app耗時(shí)的代碼,性能分析普遍我們都比較關(guān)系自己代碼的耗時(shí)而不是系統(tǒng)的.基本是必選項(xiàng).注意有些代碼耗時(shí)也會納入系統(tǒng)層級,可以進(jìn)行勾選前后前后對執(zhí)行路徑進(jìn)行比對會非常有用.
至此,timer Profiler的使用總結(jié)結(jié)束。
leaks 的使用
打開步驟同profiler相同,不再贅述。
打開后第一部將彈出的界面的statistics改為call trees,如圖四
不同于time profiler 此時(shí)選Invert Call Tree和Hide System Libraries
然后點(diǎn)開錄制按鈕
出現(xiàn)紅色錯(cuò)號就說明出現(xiàn)了內(nèi)存泄露,選則左上角的暫停代碼,并用鼠標(biāo)點(diǎn)擊錯(cuò)號得如圖五,
點(diǎn)擊任意一行得到如圖六
標(biāo)紅處為內(nèi)存泄露的具體代碼,可對其修改解決
Allocation
參考自IOS性能調(diào)優(yōu)系列:使用Allocation動態(tài)分析內(nèi)存使用情況-愛編程?
Allocation工具可以用來幫你了解內(nèi)存的分配情況
打開方式同上,略過,直接上實(shí)料
打開后我們可以看到右側(cè)(圖七)幾個(gè)比較有用的選項(xiàng)
All Objects Created
Created & Still Living
Created & Destroyed
通過以上方法可以對應(yīng)用的整體內(nèi)存使用情況有所了解,但內(nèi)存不合理使用導(dǎo)致的內(nèi)存警告往往是部分代碼或視圖導(dǎo)致的,我們往往要關(guān)注于某段時(shí)間或操作過程中內(nèi)存的分配和使用情況,Allocation提供了這種功能。
比如在進(jìn)入一個(gè)視圖前或操作前,我們在Allocation面板左側(cè)點(diǎn)擊Mark Generation,這時(shí)候會產(chǎn)生Generation A節(jié)點(diǎn),顯示內(nèi)存當(dāng)前的情況:
Generation分別記錄了進(jìn)入前、進(jìn)入后、關(guān)閉后,再最后一個(gè)Generation應(yīng)該內(nèi)存被合理釋放,否則就代表了在這個(gè)視圖或操作中有泄漏或不合理的地方。
以上只是Allocation的基本運(yùn)用,設(shè)計(jì)出一套使用Allocation來合理測試的方案是比較復(fù)雜的,后續(xù)慢慢介紹。