[轉] time profile 使用詳解

鑑於網上沒有較完善的time profile教程,官網上的介紹也很簡略,look在此寫一篇time profile的小教程,此篇文檔囊括了谷歌前兩頁的搜索結果,look濃縮翻譯了部分精華並加入了些我的理解,有不對的地方或須要補充的地方,歡迎你們斧正和指導。html

在此感謝carmelosui關於self的指正。ios

1、啓動time profiler

已使用過time profiler的同志請直接跳到2、基本介紹git

首先您的手機得有證書,能確保能run過,筆者用的是xcode5.0.2 instrument5.0.1,如下的圖示均以xcode5.0.2 instrument5.0.1爲準,有同窗反饋證書都OK了,用time profiler時app會閃退、手機接着重啓,多是手機越獄的緣由,請用非越獄手機試試。程序員

啓動time profile兩種方式objective-c

1.       長按Xcode左上角的run鍵幾秒,將會出現一個下拉列表,而後選擇profileexpress

2.       經過xcode菜單欄,Product -> Profile 啓動instrumentxcode


 

instrument裏選取time profiler,而後點Profileapp

 

Time Profile就啓動了,操做一段時間後,點擊stop,中止分析:iphone

 

回到目錄ide

2、基本介紹

若是您對time profiler每一個面板,大部分字段瞭如指掌,請跳到3、簡單的過濾

主面板

首先點擊下圖view中三個選擇器,確保全部的視圖均有打開

 

主界面以下:

1

一、  能夠經過range設置您須要關注的時間段,在圖1標識跟蹤(track)面板中

經過時間軸線,設置您的起止時間:

2.    run timer and run navigator,記錄您run的次數,經過左右三角箭能夠查看上/下一次運行:

3.       Liabrary,選取這個後,右邊會出現instrument工具的庫,您能夠選取其餘工具,而後拖到左上角的instrument視圖中,因爲look這裏只介紹time profile,其餘工具請查閱其餘文檔。

4.       過濾器,若是您須要查找具體的類或函數,在此輸入類名或函數名,圖1標識8詳情面板中將會展現您過濾後的結果

5.       跟蹤面板(track pane

6.       擴展詳情面板(extended detail pane

7.       選項面板(options pane

8.       詳情面板(detail pane)用於展現主要信息

 

詳情面板(detail pane)介紹

下面介紹最重要的詳情面板(detail pane)和擴展詳情列表(Extended Detail),time profiler下咱們主要看兩種視圖Call TreeSample List

 

調用樹(Call Tree)視圖

Column heading

DefinDefinition

翻譯

Running Time

The amount of time the symbol ran.

該符號(函數)運行時間,注意是累積時間,time profiler不會順着程序流程去統計時間

Self

The number of times the symbol calls itself.

並不是調用次數,look有發現不少self0也有耗時的狀況,經carmelosui指出後,此爲在棧頂次數,look有待考證

Symbol Name

The name of the symbol being called.

被調用的符號信息

 

詳情面板call tree視圖與擴展詳情面板對應關係如圖:

 

carmelosui指導,調用樹視圖下還能夠開啓一些官網上沒有提到的信息,如圖所示:

關於self #self self%,能夠參考carmelosui stackoverflow上的提問和carmelo對本文的評論:

http://stackoverflow.com/questions/12262695/what-do-self-and-self-mean-in-the-time-profiler-instrument

Self in the Time Profiler refers to the amount of time spent in the given function itself, excluding time spent in other methods that it calls.

 

Self % is the same thing but expressed as a percentage of the total running time.

 

# Self is the number of actual profiler samples that hit this function or method. The Time Profiler samples every 1 ms by default, so this number will often be the same as the Self value.

 

如上僅供參考,具體有待考證,look有空再demo驗證

樣本列表(sample list

Column heading

Definition

Timestamp

該採樣開始時間

Depth

堆棧深度

CPU

線程運行在哪塊cpu

Thread

The thread identifier.

Hot Frame

該採樣中調用最頻繁的函數

Responsible Library

調用該函數的庫

Responsible Caller

調用該函數的函數

 

sample list視圖下,詳情面板與擴展詳情面板對應關係如圖:

一些簡單技巧

若是您想一級級打開調用棧,點擊符號信息前的展開/收起便可,若是您想一下所有打開調用棧,按住option,再點展開/收起

 

您也能夠按耗時,調用次數的升序/降序進行排列,如圖所示:

 

放大(shift) /縮小(control)+拖動時間軸線:調整跟蹤面板的單位時間長度,

也能夠View ->snap Track to fit自動匹配合適的時間間隔顯示

 

比較兩次run的差別:

instrument->Compare Call Trees

 

回到目錄

 

3、簡單的過濾

若是您對基本的過濾方法信手拈來,4、高級的功能或許能知足您

過濾時間段

經過前面的inspection range能夠設置起止時間,關注您設定時間內的耗時,設定後的效果以下圖:

 

instrument4.0以後,我還能夠教您更快的方法,按住option,而後直接在跟蹤面板上拖動就能夠限定時間範圍

函數名或類名過濾

經過主面板圖1標識4,輸入名稱能夠直接過濾

也能夠經過Edit ->find 快捷鍵Command+F)來查找,還能夠設置查找類型:

Call Tree過濾

經過選項面板中一些選項,進行一些簡單的過濾,選項面板以下:

Call Tree下面有些頗有用的選項

Separate by Thread(建議開啓):經過線程分類,能看到哪些線程佔用cpu最多,該選項通常選上

invert Call Tree(不建議開啓):反轉調用樹,正常的詳情面板中的調用樹是從線程的根向下一級級顯示,選上該選項,則從最底層的調用向上一級級顯示,在您須要看哪一個方法調用最深時有用,通常不建議開啓此選項,

Hide Missing Symbols(建議)隱藏丟失的符號,若是應用程序或系統frameworkdSYM文件找不到,詳情面板中將看不到方法名(符號),看到的是十六進制值,對應的是指令在二進制代碼中的地址值.若是開啓這個選項,這些數值將會隱藏,只顯示能被解析的函數(符號)信息,幫助簡化顯示的信息。

Hide System Libraries(建議)當開啓這個選項,只展現和您應用程序相關的符號信息,該選項一般頗有用,由於您只關心本身代碼的耗時而不是過多關心繫統庫的cpu耗時。

Show Obj-C Only(依場景)開啓該選項僅Objective-C methods 展現,CC++函數不展現,若是您的程序用到了OpenGL ,會包含一些C++的方法。

Flatten Recursion(有遞歸時建議開啓): 這個選項會將調用棧裏遞歸函數做爲一個入口,而不是多個

Top Functions:開啓這個選項,會將最耗時的函數降序排列,這種耗時統計是累加的,例如A調用B,A的耗時統計裏包含B的耗時,若是A B函數依次是第1、二耗時的函數,在此選項下,A B會降序依次顯示。

 

經過一些過濾後,筆者的demo程序最終如圖所示:

從上圖能夠看出,RootViewController類中的tableView:cellForRowAtIndexPath:方法最耗時,

雙擊該行,能夠跳到代碼處:

發現tableView:cellForRowAtIndexPath:方法中一行代碼耗了該方法50.4%的耗時,這行代碼就應該是咱們應該優化的重點。

您也能夠打開反彙編視圖,有助於您排查問題

也能夠打開源文件進行處理,而不用在Xcode裏去查找該文件

Call Tree Constraints過濾

若是您想看調用次數超過10 或者只關心耗時超過10ms以上的函數,或者指定一個範圍,這個能夠派上用場了

count 若子級調用裏有超過該設定值的,父級調用也不會被過濾掉

 

打用戶標記

在跟蹤面板上,同時按

command+方向下鍵,能夠添加用戶標記,也能夠經過Edit->Add Flag添加

command+方向上鍵,能夠刪除用戶標記,也能夠經過Edit->Remove Flag刪除

command+方向左右鍵,移動到上/下個標記

打用戶標記能夠縮小具體場景,具體怎麼用,筆者還不太清楚,求指導。

 

Specific Data mining

暫留空,筆者還不太會用,將收集的一些說明暫且放這,求指導。

charge prune flatten

Charge symbols or Library to caller: Time Profiler will tally the time spent for a system symbol or even a complete library, to the method that calls it.

 

Prune Symbol and subtree: So you are pretty sure that there is nothing in the world that can shave a millisecond from a given portion of your app? Then you can instruct Time Profiler not to display it. In this case, Time Profiler will remove the the symbol and the subtree associate with it (all the code called from the marked symbol) from the tally.

 

Flatten Library to Boundaries: Let’s say that you call a Core Audio function, that itself spawn a lively arrange of calls to the stack. Again, you cannot do much about how Core Audio works internally, but you might find useful to instruct Time Profiler to show you just the boundaries between your code and Core Audio.

 

回到目錄

4、高級的功能

若是做爲初級用戶,前面的介紹想必已夠您大展拳腳了,下面介紹一下比較少用的高級功能,有必定幫助的功能,不徹底針對time profile

兩種錄製模式的介紹

錄製主要有兩種模式:當即模式(默認)和延時模式,下面簡單介紹下兩種模式的區別:

當即模式:默認方式,用profile探視用戶時間耗時是很是有用的,可是由於instrument和咱們探視的程序用同一塊cpu,instrument也要耗掉部分那些能被程序所利用的時間,蘋果稱之爲觀察者效應。

延時模式:iOS4以後的新特性,該模式會最小化instrumentcpu的觀察者效應,當你錄製時,這種模式會禁用instrument的實時動態刷新過程,直到錄製結束,這些數據纔會顯示出來,因此稱爲延時模式,若是您要開啓這個選項:

 

 

當開啓延時模式錄製時,您看不到instrument的實時數據,界面以下:

look並無對兩種模式的性能數據作過詳盡的對比,暫不清楚兩種模式的數據差異有多大

 

instrument4.0以後的新特性

Specific Data mining

在某行信息上,按住controle+左鍵或在某行上直接右鍵,能夠進行一些過濾

You select one of five focus options to focus on specific parts of the call tree:

Focus on subtree

只顯示選中符號的子樹,上面的調用均不顯示

Focus on calls made by <symbol name>

只展現該符號發起的子樹調用,上面的調用除了根調用均不顯示

Focus on callers of <symbol name>

Displays only the subtrees with callers of the selected symbol.

Focus on calls made by <library name>

Displays only the subtrees with calls made by symbols in the selected symbol’s library.

Focus on callers of <library name>

Displays only the subtrees with callers of symbols in the selected symbol’s library.

 

支持直接將詳情面板中的信息拷貝到文本中,

按住command鍵,能夠同時選擇不連續的多行,而後按command+C,能夠直接拷貝到文本中

 

支持看源代碼時,擴展詳情面板有彙總信息,並能夠選擇升序/降序排列,選中彙總信息表中某行,源代碼會對應顯示

 

其餘視圖

下面主要介紹其餘兩種視圖:cpu視圖和線程視圖

cpu視圖(cpu strategy

蘋果官網上提到,多核的狀況下,若是每一個核利用率太高,而其餘核利用率太低,意味着程序須要優化,上圖中,筆者的demo程序兩個核運行較均衡。

蘋果官網上提供的不均衡的場景:

若是在4核機器上,能把程序寫成如上圖所示,筆者認爲那也不是通常滴程序員。

 

線程視圖

如上圖所示,筆者demo程序中共有4個線程,第一個是主線程,用鼠標任意點一個採樣點,將會出現和擴展詳情面板裏同樣的調用棧信息

 

回到目錄

5、參考文檔

Time Profiler Instrument官方文檔:

https://developer.apple.com/library/ios/documentation/AnalysisTools/Reference/Instruments_User_Reference/TimeProfilerInstrument/TimeProfilerInstrument.html

 

Analyzing CPU Usage in Your App官方文檔

https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/AnalysingCPUUsageinYourOSXApp/AnalysingCPUUsageinYourOSXApp.html#//apple_ref/doc/uid/TP40004652-CH16-SW8

 

How to Use Instruments in Xcode

http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode

time profile詳細面板和其餘工具的介紹

 

KISS Time Profiling

http://www.digital-wave.com/blog/2013/02/08/profiling-macro/

設定用戶標記

 

Tuning performance with Instruments

http://volonbolon.net/post/897931352/tuning-performance-with-instruments

兩種錄製模式的介紹反彙編 charge  prune  flatten

 

self  self %  # self carmelosui的提問:

http://stackoverflow.com/questions/12262695/what-do-self-and-self-mean-in-the-time-profiler-instrument

 

命令行啓動instrument

http://diogogmt.wordpress.com/2012/09/17/using-instruments-time-profiler/

 

Time profiler instruments not showing objective c functions

http://stackoverflow.com/questions/12818149/time-profiler-instruments-not-showing-objective-c-functions

 

iOS 5 Tech Talk: Michael Jurewitz on Performance Measurement

http://oleb.net/blog/2011/11/ios5-tech-talk-michael-jurewitz-on-performance-measurement/

launch timePay special attention to the Self column.

 

iOS SDK: Time Profiling with Instruments

http://mobile.tutsplus.com/tutorials/iphone/ios-sdk-time-profiling-with-instruments/

講了一個重點,設置用戶標記和設定時間範圍

此文對應較差勁的中文翻譯:

http://blog.163.com/zhuhongwei_2012/blog/static/19541097720130933430461

 

斯坦福ios開發教程- Time Profiler (November 4, 2011)

http://v.youku.com/v_show/id_XNDUyMjIwNTY4.html

 

New Features in Instruments 4.0

https://developer.apple.com/library/ios/documentation/AnalysisTools/Conceptual/WhatsNewInstruments/NewFeatures40/NewFeatures40.html

相關文章
相關標籤/搜索