一、Instruments簡介
(1)Instruments 是應用程序用來動態跟蹤和分析 Mac OS X 和 iOS 代碼的實用工具。 這是一個靈活而強大的工具,它讓你可以跟蹤一個或多個進程,并檢查收集的數據。 這樣,Instruments 可以幫你更好的理解應用程序和操作系統的行為。
(2)Instruments包括 Blank(空白)、Activity Monitor(活動監視器)、Allocations(內存分配)、Cocoa Layout(頁面布局)、Core Animation(核心動畫)、Core Data(數據庫)、counters(計數器)、Energy Log(電量輸出日志)、File Activity(文件活動)、Leaks(內存泄漏)、Metal System Trace(金屬系統跟蹤)、NetWork(網絡監測)、System Trace(系統跟蹤)、Time Profiler(時間分析)、Zombies(僵尸對象)等16個功能。
(3)官方使用指南地址:
二、Instruments啟動方式
?(1)Xcode -> Open Developer Tool -> Instruments
(2)Product -> Profile
(3)長按啟動按鈕 -> Profile
三、Instruments使用
(1)Activity Monitor 活動監視器
(2)Allocations(內存分配)
? ? ? ? 蘋果開發文檔內存分類:
? ? ? ? 1.Leaked memory: Memory unreferenced by your application that cannot be used again or freed (also detectable by using the ? ? ? ? ? ?Leaks instrument).
? ? ? ? ?2.Abandoned memory: Memory still referenced by your application that has no useful purpose.
? ? ? ? ?3.Cached memory: Memory still referenced by your application that might be used again for better performance.
? ? ? ? 其中Leaked memory 和Abandoned memory 都屬于應該釋放而沒釋放的內存,都是內存泄露。
(3)Cocoa Layout? 頁面布局
? ? ? ? 觀察NSLayoutConstraint對象的改變,幫助我們判斷什么時間什么地點的constraint是否合理。
(4)Core Animation 核心動畫
? ? ? ? ?檢測Core Animation 性能工具,主要針對GPU和CPU的使用進行優化。通常會把屏幕渲染工作交給GPU來處理;CPU主要負 ? ? ? ?責運算等方面的處理。(Core Animation does not support the iOS Simulator platform)
? ? ?根據WWDC的說法,當在滑動視圖時,FPS低于45的時候,用戶會感覺到滑動有卡頓。
? ? ? ?1. Color Blended Layers (圖層混合)
? ? ? ? ? ? 界面都是會出現多個UI控件疊加的情況,如果有透明或者半透明的控件,那么GPU會去計算這些這些layer最終的顯示的顏色。基于渲染程度對屏幕中混合區域進行綠到紅的高亮顯示,越紅表示性能越差,會對幀率等指標造成較大影響。
? ? ? ? ? ? 優化方法:設置opaque 屬性為true;調整布局,盡量不要疊加;給View設置一個不透明的顏色,沒有特殊需要設置白色即可。
? ? ? ? 2. Color Hits Green and Misses Red(光柵化)
? ? ? ? ? ? 當UIView.layer.shouldRasterize = YES 時,在觸發離屏繪制的同時,會將光柵化后的內容緩存起來,如果對應的layer及其sublayers沒有發生改變,在下一幀的時候可以直接復用。這將在很大程度上提升渲染性能。
? ? ? ? 3. Color Copied Images(圖片顏色格式)
? ? ?蘋果的GPU只解析32bit的顏色格式,對于GPU不支持的色彩格式的圖片只能由CPU來處理,這樣的圖片為藍色,藍色越多性能越差。因為如果在滾動加載大量圖片時,由CPU來處理圖片,可能會阻塞主線程。
? ? ? ? 4. Color Non-Standard Surface Formats (標記不標準的表面顏色格式)
? ? ? ? 5. Color Immediately(顏色刷新頻率)
? ? ? ? ? ?當執行顏色刷新的時候移除10ms的延遲,因為可能在特定情況下你不需要這些延遲,所以使用此選項加快顏色刷新的頻率。不過一般這個調試選項我們是用不到的。
? ? ? ? 6. Color Misaligned Images(圖片大小)
? ? ? ? ? 這個選項可以幫助我們查看圖片大小是否正確顯示。如果image size和imageView size不匹配,image會出現黃色。要盡可能的減少黃色的出現,因為image size與imageView size不匹配,會消耗資源壓縮圖片。
? ? ? ? ?7. Color Offscreen-Rendered Yellow(離屏渲染)
? ? ? ? ? ? 離屏渲染Off-Screen Rendering 指的是GPU在當前屏幕緩沖區以外新開辟一個緩沖區進行渲染操作。還有另外一種屏幕渲染方式-當前屏幕渲染On-Screen Rendering ,指的是GPU的渲染操作是在當前用于顯示的屏幕緩沖區中進行。 離屏渲染會先在屏幕外創建新緩沖區,離屏渲染結束后,再從離屏切到當前屏幕, 把離屏的渲染結果顯示到當前屏幕上,這個上下文切換的過程是非常消耗性能的,實際開發中盡可能避免離屏渲染。
? ? ? ? ? 觸發離屏渲染Offscreen rendering的行為:
? ? ? ?(a)drawRect:方法
? ? ? ?(b)layer.shadow
? ? ? ?(c)layer.allowsGroupOpacity or layer.allowsEdgeAntialiasing
? ? ? ?(d)layer.shouldRasterize
? ? ? ?(e)layer.mask
? ? ? ?(f)layer.masksToBounds && layer.cornerRadius
? ? ? ? ? ?這里有需要注意的是第三條layer.shouldRasterize ,其實就是我們本文講的第二個選項光柵化,光柵化會觸發離屏渲染,因此光柵化慎用。第六條設置圓角會觸發離屏渲染,如果在某個頁面大量使用了圓角,會非常消耗性能造成FPS急劇下降,設置圓角觸發離屏渲染要同時滿足下面兩個條件:layer.masksToBounds = YES;layer.cornerRadius = 5;
? ? ? ? 為了盡可能避免觸發離屏渲染,我們可以使用貝塞爾曲線設置圓角。
? ? ? ?8. Color Compositing Fast-Path Blue (快速路徑)
? ? ? ? ? ?標記由硬件繪制的路徑為藍色,藍色越多越好,可以對直接使用OpenGL繪制的圖層進行高亮。
? ? ? ?9. Flash Updated Regions (重繪區域)
? ? ? ? ? ?這個選項會對重繪的內容高亮成黃色,重繪就是指使用Core Graphics繪制,繪制會損耗一定的性能,因此重繪區域應該越小越好。
(5)Core Data(數據庫)
? ? ? ? 主要是用于監測讀取、緩存未命中、保存等操作,能直觀顯示是否保存次數遠超實際需要。
(6)counters(計數器)
? ? ? ? 從用戶管理的點事件計數器儀器記錄信息。它可以記錄從一個過程或系統上運行的所有進程的信息。需要真機測試
(7)Energy Diagnostic? 能量診斷
? ? ? ? ?用于Xcode下的Instruments來分析手機電量消耗的。(需要真機測試)
(8)File Activity? 文件活動
? ? ? ? ?這個模板活動監視器文件和目錄,包括文件打開或者關閉,文件權限修改,目錄創建,文件移動等。不支持iOS 平臺。
(9)Leaks 內存泄漏
? ? ? ? 查看內存使用情況,檢查泄漏內存,并提供按類別分配對象內存地址以及內存地址歷史分配記錄和泄漏塊的統計信息。
? ?1. Separate by Category 類別分離
? ?2. Separate by Thread ?線程分離,只有這樣才能在調用路徑中能夠清晰看到占用CPU最大的線程.
? ?3. ?Invert Call Tree?從上到下跟蹤堆棧信息.這個選項可以快捷的看到方法調用路徑最深方法占用CPU耗時,比如FuncA{FunB{FunC}},勾選后堆棧以C->B->A把調用層級最深的C顯示最外面.
? ?4. Hide System Libraries 隱藏系統調用庫
? ?5. Flatten Recursion ?處理遞歸(自己調用自己),在每個棧中只跟蹤一個,而不是多個。
(10)Metal System Trace(金屬系統跟蹤)
金屬系統跟蹤通過從應用程序,驅動程序和gpu層提供跟蹤信息來描述ios和macos金屬應用程序的性能。
(11)Network 網絡監測
分析應用程序如何使用TCP / IP和UDP / IP連接使用連接儀器。
(12)System Trace? 系統跟蹤
? ? ? ? 該模板提供了系統行為的全面信息。它顯示線程何時調度,并顯示從用戶到系統代碼的線程轉換,通過系統調用和內存操作。這個模板可以在OS X操作系統和iOS上使用。
(13)System Usage? 系統使用
? ? ? ? ?這個模板監視一個應用程序和記錄系統的I / O活動相關的文件,套接字和共享內存。這包括輸入,輸出,時間回溯,調用樹,乃至每一次響應。該模板只可用于iOS。
(14)Time Profiler? 時間分析器
? ? ? ? ?用來檢測app中每個方法所用的時間,并且可以排序,并查找出哪些函數占用了大量時間。
(15)Zombies? 僵尸對象
? ? ? ? ?用來檢測過度釋放的“僵尸”對象,還提供了數據對象分配的類以及所有活動分配內存地址的歷史記錄。
? ? ? ? ?使用Zombies工具來查找僵尸對象: Zombies工具的查找原理其實和設置NSZombieEnabled環境變量的調試方法是一樣的,啟動Zombies后在內部設置了NSZombieEnabled為true。
? ? ? ? ?啟用了NSZombieEnabled的話,它會用一個僵尸對象來代替已釋放對象。也就是在引用計數降到0時,該僵尸實現會將該對象轉換成僵尸對象。僵尸對象的作用是在你向它發送消息時,就不會向之前那樣Crash或者產生 一個難以理解的行為,而是放出一個錯誤消息,它會顯示一段日志并自動跳入調試器, 因此我們就可以找到具體或者大概是哪個對象被錯誤的釋放了。