按照固定的時(shí)間間隔,定時(shí)對(duì)線程中的調(diào)用堆棧進(jìn)行采樣,獲取一個(gè)sample. 之后統(tǒng)計(jì)在這一時(shí)段內(nèi),某個(gè)方法出現(xiàn)在sample中次數(shù)。以此來(lái)表示該函數(shù)的運(yùn)行情況

一、打開Instruments 再打開Time Profiler
啟動(dòng)Xcode -> Instruments


二、點(diǎn)擊開始運(yùn)行按鈕,運(yùn)行目標(biāo)APP

Weight
Doesn’t measure duration. Aggregates samples into a useful summary.
weight的前面可以看到也有ms的時(shí)間。但是weight不代表duration. 這是 采樣次數(shù)*采樣間隔。采樣間隔通常是1ms
所以更合理的觀察方法是參考Weight的百分比值。
Self Weight
該函數(shù)在自己的函數(shù)體內(nèi)花費(fèi)的時(shí)間。有的函數(shù)A內(nèi)部只是簡(jiǎn)單調(diào)用其他函數(shù)B。這時(shí)A的Weight雖然可能高,但是它的Self Weight幾乎為0. 可以進(jìn)一步觀察其子函數(shù)B. Weight高并且Self weight也高的是真正耗時(shí)的函數(shù)。
Call Tree
點(diǎn)擊下方Call Tree按鈕,可以看到有一些勾選項(xiàng)
Hide System Libraries。
這個(gè)很有用,可以屏蔽掉系統(tǒng)的的調(diào)用。這部分通常不是關(guān)注的Invert Call Tree
堆棧默認(rèn)是從上往下顯示的。勾選這個(gè)后會(huì)反向顯示,可以把耗時(shí)的子調(diào)用直接顯示出來(lái)。其他也有各自的功能
圖形顯示區(qū)域
- 可以拖動(dòng)游標(biāo),選定只觀察某一個(gè)時(shí)間范圍內(nèi)的采樣數(shù)據(jù)。
- 可以點(diǎn)擊左側(cè)MainThread欄,從而只觀察發(fā)生在MainThread上的采樣數(shù)據(jù)
- 使用
option +和option -來(lái)zoom in和zoom out - 堆棧顯示面板,按住
option點(diǎn)擊箭頭,可以把子調(diào)用樹全部展現(xiàn),不用一級(jí)一級(jí)點(diǎn)。
符號(hào)加載
對(duì)檢測(cè)到的我們項(xiàng)目自己的函數(shù),Instrument有時(shí)顯示的只是函數(shù)地址,這是因?yàn)閍pp相關(guān)的符號(hào)文件沒有加載進(jìn)來(lái)。
如果有app該版本的符號(hào)文件,可以 Menu -> Files -> Symbols。 分別選擇app以及framework的符號(hào)文件。
tips: 如果是debug模式的包,默認(rèn)pod庫(kù)編譯的framework是沒有符號(hào)的。如果需要,可以在Xcode的面板中選擇 Pods -> Project Pods -> Build Settings -> Build Options -> Debug Information Format -> DWARF with dSYM File
三、工具欄設(shè)置,方便快速定位問(wèn)題

Separate by State : 線程分離,狀態(tài)分開顯示 ,例如:Running狀態(tài),
Separate by Thread : 線程分離, 每個(gè)線程分開顯示,只有這樣 才能在調(diào)用路徑中能夠清晰看到占用CPU耗時(shí)最大的線程.
Invert Call Tree : 從上到下跟蹤堆棧信息.這個(gè)選項(xiàng)可以快捷的看到方法調(diào)用路徑最深方法占用CPU耗時(shí),比如FunA{FunB{FunC}},勾選后堆棧以C->B->A把調(diào)用層級(jí)最深的C顯示最外面.
Hide System Libraries : 隱藏系統(tǒng)調(diào)用,只關(guān)注自己代碼的耗時(shí)
Flatten Recursion : 遞歸函數(shù), 每個(gè)堆棧跟蹤一個(gè)條目
Top Functions : 顯示某個(gè)函數(shù)的總時(shí)間,A函數(shù)內(nèi)調(diào)用多個(gè)函數(shù)時(shí),可以顯示A函數(shù)的總耗時(shí)
