一、介紹說明
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、界面如下:
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/IP
和 UDP/IP
連接。
Automations
:創(chuàng)建和編輯測試腳本
來自動化
iOS 應用的用戶界面測試
。
4、工具界面:
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(擴展詳情)
。
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í)行的時間
1.選擇 Time Profiler
,并點擊Choose
按鈕。
2.選擇正確的設備和應用程序
3.點擊紅色按鈕
運行后,就能得到 CPU 性能的結(jié)果
4.勾選右邊Call Tree
中Separate by Thread
、Invert Call Tree
和 Hide System Libraries
選項后,可以看到對應的代碼
執(zhí)行耗時
例如下面的結(jié)果,找出哪一行的 Weight 列上有最大
的百分比。注意 Main Thread 一行使用了一個很大
的 CPU 百分比。點擊左邊的小箭頭
,展開這行,不停向下展開直到看到你自己的方法
(有一個人像圖標
標出的方法)??赡苣承?shù)字略有不同,但各行數(shù)據(jù)的順序應當類似如下所示:
可以看到大量的時間被花在了使用“tonal”濾鏡
的方法上。接下來找出這個方法中到底做了些什么。
5.雙擊該方法
,可以看到代碼詳情
。打開如下這個界面:
發(fā)現(xiàn)不太好提升性能:創(chuàng)建 CGImage 方法本身花費的時間就是需要這么長,那么可以看看 applyTonalFilter()方法
是如何調(diào)用的。在代碼視圖的頂部,點擊面包屑導航尾部的 Root,回到之前的界面:
現(xiàn)在點擊頂部applyTonalFilter
左邊的小箭頭。這會顯示出 applyTonalFilter 的調(diào)用者
。你還需要展開下一行,在 Profile Swift 時,有時候會在調(diào)用樹中存在一些相同的行,前綴中包含 @objc。你感興趣的是第一行,它以一個人像圖標作為前綴,這表明它屬于你 app 的 target:
可以看到調(diào)用者是 collection view 的(_:cellForItemAt:)方法
。雙擊
這行可以查看相關源代碼如下圖:
不難看出第 75 行,這個方法使用了耗時
的 tonal 濾鏡,而且它是直接在 collectionView(_:cellForItemAt:) 方法中調(diào)用的,這樣每當獲取一張濾鏡圖片的時候就會對主線程(以及整個 UI)造成阻塞
。
要解決這個問題,需要采取兩個措施:首先,使用 DispatchQueue.global().async 方法
將圖像濾鏡的生成拆解到后臺線程
中進行;然后在圖像生成后對圖像進行緩存
。判斷如果有緩存則直接用緩存。
現(xiàn)在需要回到 Xcode進行代碼操作:
1、可以手動
找出你在 Instruments 中看到的源代碼
2、更簡單的方法,面板的代碼上面有個 Open in Xcode
按鈕,點擊它Xcode 會自動打開
并定位
到正確的地方:
2、Core Animation
評估圖形性能
用于調(diào)試
離屏渲染
,繪圖
,動畫
,圖層混合
等GPU耗時
操作
1.選擇 Core Animation,并點擊 Choose按鈕。
2.選擇正確的設備和應用程序
3.點擊紅色按鈕運行后,隨著我們操作 App,就能得到數(shù)據(jù)
在右邊面板的 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)存泄露
1.選擇 Leaks,并點擊 Choose按鈕。
2.選擇正確的設備和應用程序
3.點擊紅色按鈕運行后,隨著我們操作 App,就能得到數(shù)據(jù)
4.可在下圖這個位置選擇,展示的不同模式
5.在Call Trees模式下,在Settings 中勾選 Invert Call Tree 或 Hide System Libraries,或其他選項可以過濾顯示的數(shù)據(jù)。
6.出現(xiàn)內(nèi)存泄露的情況
7.選中上圖的Leak Checks 一欄
8.然后點擊導航欄切換到“Call Tree”模式
9.勾選右邊的詳細窗口 Display Settings中的 Call Tree中 Separate by Thread和 Hide System Libraries兩個選項,Hide System Libraries作用是隱藏系統(tǒng)函數(shù)。能方便的看到程序中代碼所在的位置。
10.勾選之后,雙擊一下就會來到內(nèi)存泄漏的地方
參考資料:
http://www.lxweimin.com/p/e6b4726b4439
http://www.lxweimin.com/p/660c4601cfc8