Instrument工具介紹與使用

一、介紹說明

Instrument是性能分析、動態(tài)跟蹤和分析OS X和iOS代碼的測試工具。常見有CPU性能測試、圖形性能測試、內(nèi)存性能測試等,可以讓您追蹤程序運行的過程,收集數(shù)據(jù),并檢查所收集的數(shù)據(jù)。

1、通過Xcode工具欄中Product->Profile(command+i)啟動界面
2、建議使用真機測試,數(shù)據(jù)會更可靠。模擬器運行和真機運行的CPU有差別。
3、應用程序運行一定要發(fā)布配置 而不是調(diào)試配置。

1、界面如下:

Instrument工具欄截圖.png

2、功能說明:

1.追蹤代碼中的(甚至是那些難以復現(xiàn)的)問題;\
2.分析程序的性能(CPU、內(nèi)存性能等);
3.實現(xiàn)程序的自動化測試;
4.部分實現(xiàn)程序的壓力測試
5.執(zhí)行系統(tǒng)級別的通用問題追蹤調(diào)試;
6.了解程序的內(nèi)部運行過程。

3、常用模板:

Leaks(泄漏):一般的查看內(nèi)存使用情況,檢查泄漏的內(nèi)存,并提供了所有活動的分配和泄漏模塊的類對象分配統(tǒng)計信息以及內(nèi)存地址歷史記錄;
Time Profiler(時間探查):執(zhí)行對系統(tǒng)的 CPU上運行的進程低負載時間為基礎采樣。
Allocations(內(nèi)存分配):跟蹤過程的匿名虛擬內(nèi)存和堆的對象提供類名和可選保留/釋放歷史;
Activity Monitor(活動監(jiān)視器):顯示器處理的 CPU、內(nèi)存和網(wǎng)絡使用情況統(tǒng)計;
Blank(空模板):創(chuàng)建一個空的模板,可以從Library 庫中添加其他模板;
Automation(自動化):這個模板執(zhí)行它模擬用戶界面交互為 iOS 手機應用從 instrument 啟動的腳本;
Core Data:監(jiān)測讀取、緩存未命中、保存等操作,能直觀顯示是否保存次數(shù)遠超實際需要。
Cocoa Layout:觀察約束變化,找出布局代碼的問題所在。
Network:跟蹤 TCP/IPUDP/IP 連接。
Automations:創(chuàng)建和編輯測試腳本自動化 iOS 應用的用戶界面測試

4、工具界面:

image

1、控制記錄過程,點擊紅色的"記錄"按鈕可以停止或開始當前正在分析的app(在記錄和停止按鈕之間切換),暫停鍵,暫停當前正在運行的app。

2、執(zhí)行計時器(run timer),計時器記錄著正在分析的app執(zhí)行了多長時間、執(zhí)行了多少次。如果你使用記錄控制按鈕來停止你的app,然后重啟,這將創(chuàng)建一個新的運行記錄,同時會顯示"Run 2 of 2"。

3、被稱作路徑(track),如你選擇的Time Profiler工具而言,因為只有一個工具,所以這里只有一條路徑

4、詳情面板,展示你正在使用的工具的主要信息。如圖展示的是最"笨重(hottest)"的方法—即占用CPU時間最長的方法。點擊上方的bar會看到Call Tree(左手邊的那個)并選中Sample List,會看到數(shù)據(jù)的不同視圖,視圖展示了每一個示例。點擊其中幾個,會在Extended Detail inspector中看到被捕獲的堆棧跟蹤。

5、檢查器(inspector)面板,一共有三個檢查器:record setting(記錄設置),display setting(展示設置),和extends detail(擴展詳情)

image

5、Call Tree各個選項和功能:

Separate by Thread: 每個線程應該分開考慮。只有這樣你才能揪出那些大量占用CPU的"重"線程

Invert Call Tree: 從上到下跟蹤堆棧,表中的方法將從第0幀開始取樣,也就是說FuncA{FunB{FunC}} 勾選此項后堆棧以C->B-A 把調(diào)用層級最深的C顯示在最外面

Hide Missing Symbols: 如果dSYM無法找到你的app或者系統(tǒng)框架的話,那么表中看不到方法名只能看到十六進制的數(shù),如果勾線此項可以隱藏這些符號,便于簡化數(shù)據(jù)

Hide System Libraries: 勾選此項會顯示app的代碼,這是非常有用的,因為通常你只關心cpu花在自己代碼上的時間不是系統(tǒng)上的時間

Show Obj-C Only: 只顯示oc代碼,如果你的程序是像OpenGl這樣的程序,則不要勾選,因為他有可能是C++

Flatten Recursion: 遞歸函數(shù), 每個堆棧跟蹤一個條目

Top Functions: 這個選項讓 Instruments 將一個函數(shù)的整個CPU 時間看成是在該函數(shù)中用去的 CPU 時間的總合,也就是該函數(shù)調(diào)用了的所有函數(shù)所花去的時間。比如函數(shù) A 調(diào)用了函數(shù) B,則 A 的時間就是 A 花去的時間加上 B 花去的時間。它允許你在追溯調(diào)用棧時獲得最大的時間數(shù),在你最耗時的方法上歸零。

二、工具使用

1、Time Profiler

時間分析工具:

用來檢測CPU性能、各個方法執(zhí)行的時間

image

1.選擇 Time Profiler,并點擊Choose按鈕。
2.選擇正確的設備和應用程序
3.點擊紅色按鈕運行后,就能得到 CPU 性能的結(jié)果
4.勾選右邊Call TreeSeparate by Thread、Invert Call TreeHide System Libraries選項后,可以看到對應的代碼執(zhí)行耗時

image

例如下面的結(jié)果,找出哪一行的 Weight 列上有最大的百分比。注意 Main Thread 一行使用了一個很大的 CPU 百分比。點擊左邊的小箭頭,展開這行,不停向下展開直到看到你自己的方法(有一個人像圖標標出的方法)??赡苣承?shù)字略有不同,但各行數(shù)據(jù)的順序應當類似如下所示:

image

可以看到大量的時間被花在了使用“tonal”濾鏡的方法上。接下來找出這個方法中到底做了些什么。

5.雙擊該方法,可以看到代碼詳情。打開如下這個界面:

image

發(fā)現(xiàn)不太好提升性能:創(chuàng)建 CGImage 方法本身花費的時間就是需要這么長,那么可以看看 applyTonalFilter()方法是如何調(diào)用的。在代碼視圖的頂部,點擊面包屑導航尾部的 Root,回到之前的界面:

image

現(xiàn)在點擊頂部applyTonalFilter 左邊的小箭頭。這會顯示出 applyTonalFilter 的調(diào)用者。你還需要展開下一行,在 Profile Swift 時,有時候會在調(diào)用樹中存在一些相同的行,前綴中包含 @objc。你感興趣的是第一行,它以一個人像圖標作為前綴,這表明它屬于你 app 的 target:

image

可以看到調(diào)用者是 collection view 的(_:cellForItemAt:)方法。雙擊這行可以查看相關源代碼如下圖:

截屏2020-01-09下午3.08.48.png

不難看出第 75 行,這個方法使用了耗時的 tonal 濾鏡,而且它是直接在 collectionView(_:cellForItemAt:) 方法中調(diào)用的,這樣每當獲取一張濾鏡圖片的時候就會對主線程(以及整個 UI)造成阻塞。

要解決這個問題,需要采取兩個措施:首先,使用 DispatchQueue.global().async 方法將圖像濾鏡的生成拆解到后臺線程中進行;然后在圖像生成后對圖像進行緩存。判斷如果有緩存則直接用緩存。

現(xiàn)在需要回到 Xcode進行代碼操作:
1、可以手動找出你在 Instruments 中看到的源代碼
2、更簡單的方法,面板的代碼上面有個 Open in Xcode按鈕,點擊它Xcode 會自動打開定位到正確的地方:

Snip20200109_1.png

2、Core Animation

評估圖形性能

用于調(diào)試離屏渲染繪圖,動畫,圖層混合GPU耗時操作

image

1.選擇 Core Animation,并點擊 Choose按鈕。
2.選擇正確的設備和應用程序
3.點擊紅色按鈕運行后,隨著我們操作 App,就能得到數(shù)據(jù)

image

在右邊面板的 Settings 區(qū)域,我們可以看到多個 Debug Options:

Color Blended Layers
這個選項基于渲染程度對屏幕中的混合區(qū)域進行綠到紅的高亮顯示,越紅表示性能越差,會對幀率等指標造成較大的影響。紅色通常是由于多個半透明圖層疊加引起。

Color Hits Green and Misses Red
UIView.layer.shouldRasterize = YES時,耗時的圖片繪制會被緩存,并當做一個簡單的扁平圖片來呈現(xiàn)。這時候,如果頁面的其他區(qū)塊(比如 UITableViewCell 的復用)使用緩存直接命中,就顯示綠色,反之不命中,就顯示紅色。紅色越多,性能越差。因為柵格化生成緩存的過程是有開銷的,如果緩存能被大量命中和有效使用,則總體上會降低開銷,反之則意味著要頻繁生成新的緩存,這會讓性能問題雪上加霜。

Color Copied Images
對于GPU 不支持的色彩格式的圖片只能由 CPU來處理,把這樣的圖片標為藍色。藍色越多,性能越差。因為,我們不希望在滾動視圖的時候,由 CPU 來處理圖片,這樣可能會對主線程造成阻塞

Color Immediately
通常 Core Animation Instruments 以每毫秒 10 次的頻率更新圖層調(diào)試顏色。對某些效果來說,這顯然太慢了。這個選項就可以用來設置每幀都更新(可能會影響到渲染性能,而且會導致幀率測量不準,所以不要一直都設置它)。

Color Misaligned Images
這個選項檢查了圖片是否被縮放,以及像素是否對齊。圖片被放縮的會被標記為黃色,像素不對齊則會標注為紫色黃色、紫色越多,性能越差。

Color Offscreen-Rendered Yellow
這個選項會把那些離屏渲染的圖層顯示為黃色。黃色越多,性能越差。這些顯示為黃色的圖層很可能需要用 shadowPath或者 shouldRasterize優(yōu)化。

Color OpenGL Fast Path Blue
這個選項會把任何直接使用 OpenGL 繪制的圖層顯示為藍色藍色越多,性能越好。如果僅僅使用UIKit或者 Core Animation 的 API,那么不會有任何效果。如果使用 GLKView 或者CAEAGLLayer,那如果不顯示藍色塊的話就意味著你正在強制 CPU 渲染額外的紋理,而不是繪制到屏幕。

Flash Updated Regions
這個選項會把重繪的內(nèi)容顯示為黃色不該出現(xiàn)的黃色越多,性能越差。通常我們希望只是更新的部分被標記為黃色。

3、Leaks

用來檢測內(nèi)存泄露

image

1.選擇 Leaks,并點擊 Choose按鈕。
2.選擇正確的設備和應用程序
3.點擊紅色按鈕運行后,隨著我們操作 App,就能得到數(shù)據(jù)

image

4.可在下圖這個位置選擇,展示的不同模式

image

5.在Call Trees模式下,在Settings 中勾選 Invert Call Tree 或 Hide System Libraries,或其他選項可以過濾顯示的數(shù)據(jù)。

6.出現(xiàn)內(nèi)存泄露的情況

image

7.選中上圖的Leak Checks 一欄
8.然后點擊導航欄切換到“Call Tree”模式

image

9.勾選右邊的詳細窗口 Display Settings中的 Call Tree中 Separate by Thread和 Hide System Libraries兩個選項,Hide System Libraries作用是隱藏系統(tǒng)函數(shù)。能方便的看到程序中代碼所在的位置。

10.勾選之后,雙擊一下就會來到內(nèi)存泄漏的地方

1483717-1dd1bdc04365a3fd.png

參考資料:
http://www.lxweimin.com/p/e6b4726b4439
http://www.lxweimin.com/p/660c4601cfc8

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內(nèi)容