轉發自:kyle
一直斷斷續續的學習instrument,沒有整理相關的經驗與資料,久而久之就慢慢忘記了,所以今天就靜下心來整理一下time profiler相關的資料。
如何啟動
已知曉者可略過直接進入<界面介紹>
time profiler的啟動分為真機抓包、代碼profile這兩種方式,如果需要更接近真實數據建議使用低配置一點的機器使用真機抓包,這樣誤差會更少些。
1、真機抓取
真機抓包的前提是手機要有證書,并且能夠通過Instrument run起APP,否則是抓不到任何數據包的。如何確實是run不了真機的APP,那可以略過這節直接進入代碼層面的profile。
右擊XCode圖標,如下選擇:
打開之后雙擊Time Profiler即可打開:
打開之后選擇你需要連接的APP即可抓包:
2、代碼profile
這個方法抓包的到數據不一定真實,因為是使用模擬器來抓包,如果只是想要個大概的數據,這種方法也是一種不錯的選擇。
啟動XCode,選擇菜單Product –> Profile:
Instrument啟動之后會彈出一個如上的選擇界面,雙擊Time Profiler即可。
界面介紹
如果您對time profiler的主界面了如指掌,可直接進入<使用技巧>
下圖是一般使用到的視圖都打開的界面,如跟您的不一樣請不要吃驚,可通過設置開啟一樣的界面:
下面我們就對主界面的幾個重點區域分別介紹:
1、設置關注時間段
通過設置開始、設置結束、清除設置來查看您所關心的范圍的數據:
2、運行記錄
可查看多次運行的數據,進行可視化對比:
3、視圖開關
分別為三個視圖的開關,全部選上可達到主界面截圖效果。
4、Liabrary
用于添加其它數據抓取工具,需要添加直接將liabrary內的圖標拖到左邊的Instruments列中。
5、搜索條
如果您需要快速查找具體的類或函數,可在些輸入類名或者函數名,會有意想不到的效果。
6、數據可視化面板
可在此設置您需要關注的范圍,以便將不相干的內容過濾掉。
7、相關內容擴展詳情面板
8、選項面板
這個會在使用技巧中提到如果使用。
9、詳情面板
在time profiler下主要是看Call Tree和Sample List這兩種視圖:
調用樹(Call Tree)
Running Time:函數運行的時間,這個時間是累積時間
Self:在棧頂次數
Symbol Name:被調用函數的符號信息
從詳情面板Call Tree與相關內容擴展詳情面板對應的關系圖:
詳情面板更多的信息選項(由于本人還未對此做深入研究,所以還不懂它們的作用):
樣本列表(Sample List)
Timestamp:采樣的開始時間
Dep:堆棧深度
CPU:線程運行在那一個CPU上
Process:進程名稱
Thread:所在的線程名稱
Hot Frame:采樣中調用最多的函數
Responsible Library:調用該函數的庫
Responsible Caller:調用該函數的函數
使用技巧
技巧收集點比較亂,都是些在使用中發現的。如您有更好的請麻煩也告知我,大家一起進步成長熟練。
1、快速展開/折疊調用棧
如您不想一級一級的展開調用棧,可如下操作一次全部展開或者折疊。
2、比較兩次run的差異
如您想將多次run的結果進行差異對比,可如下操作:
3、過濾
3.1、按著option鍵在主界面6中通過拖動鼠標來選擇需要過濾的時間段。
3.2、Command+F查找過濾的函數名或者類名。
3.3、Call Tree過濾,在主界面8中直接選擇:
Separate byt Thread(建議選擇):通過線程分類來查看那些純種占用CPU最多。
Invert Call Tree(不建議選擇):調用樹倒返過來,將習慣性的從根向下一級一級的顯示,如選上就會返過來從最底層調用向一級一級的顯示。如果想要查看那個方法調用為最深時使用會更方便些。
Hide Missing Symbols(建議選擇):隱藏丟失的符號,比如應用或者系統的dSYM文件找不到的話,在詳情面板上是看不到方法名的,只能看一些讀不明的十六進值,所以對我們來說是沒有意義的,去掉了會使閱讀更清楚些。
Hide System Libraries(建議選擇):選上它只會展示與應用有關的符號信息,一般情況下我們只關心自己寫的代碼所需的耗時,而不關心系統庫的CPU耗時。
Show Obj-C Only(建議選擇):選上它只會展示Objective-C methods,C和C++的函數是不會展示的,不過如果您的應用有寫C和C++的代碼時也想要查看這些代碼的耗時,那就建議不要選擇上。
Flatten Recursion(一般不選):選上它會將調用棧里遞歸函數作為一個入口。
Top Functions(一般不選):選上它會將最耗時的函數降序排列,而這種耗時是累加的,比如A調用了B,那么A的耗時數是會包含B的耗時數。
3.4、Call Tree Constraints過濾
Count:設置調用的次數。
Time (ms):設置耗時范圍。
4、關聯代碼
例如我想要查看setBackgroundColo這個函數的代碼處,可以直接雙擊它就會跳轉到關聯的代碼段。
跳轉到的代碼段可看到提示這里有100%的耗時。
5、數據錄制模式
如上面介紹的都是使用實時模式,其實還有另一種模式是延時模式,它們的區別在乎:
實時模式:這是一個默認模式,因為它是實時的所以Instrument和應用是使用同一塊CPU,自然也會對CPU是一種耗時,所以抓得到的數據是會有所影響,但官方蘋果表示這個影響不會很大。
延時模式:這個模式會更小化對數據影響,當您在錄制時這種模式會禁掉Instrument的實時動態刷新效果,直接到錄制完成才會將數據顯示出來。
模式切換如下:
當選擇了延時模式抓數據時,您是看不到任何Instrument給你提供的信息,只能等你抓包結束之后才會顯示出來: