IOS效能檢測工具-Instruments
Instruments 簡介
Instruments 是 Xcode 的一個工具集,為我們提供了強大的程式效能分析及測試能力。使用 Instruments 你可以做下面這些事:
- 檢查一個或多個應用或程序的行為。
- 檢查裝置相關的功能,比如:Wi-Fi、藍芽等。
- 在真機或模擬器上進行效能測試。
- 建立自定義的 DTrace 來分析系統以及應用的各種行為。
- 跟蹤原始碼中的問題。
- 對 App 進行效能分析。
- 查詢 App 中的記憶體問題,比如:記憶體洩露(Leaked memory)、廢棄記憶體(Abandoned memory)、殭屍(zombies)等。
- 給出程式優化的建議。
- 進行系統級別的問題定位。
- 通過指令碼記錄一個使用者行為序列,從而可以通過執行指令碼對你的 iOS 應用進行可重複多次的自動化測試。
- 儲存測試配置模板以供複用。
可以看到 Instruments 功能很多,這裡先介紹一下我們在開發中常用到的幾種:CPU 效能測試、圖形效能測試、記憶體效能測試。
雖然 Instruments 是 Xcode 的一個工具集,但是它是以一個獨立的 App 的形式存在的,你可以在 Xcode
-> Open Developer Tool -> Instruments
中開啟它。
CPU 效能
要看程式執行時間效能,主要有下面幾步:
1、先在 Xcode 中對當前的專案做 Profile (Command-I):
這時就會開啟 Profiling Template 選項對話方塊:
2、選擇 Time Profiler
這個模板,並點選 Choose
按鈕。
3、進入 Instruments 後,選擇正確的裝置和應用程式:
4、點選紅色按鈕執行後,就能得到 CPU 效能的結果了:
我們還能在時間軸面板裡面去選擇一段時間來檢視該時間段裡更為細節的 CPU 效能:
同時在中間的導航條以及右下角的控制面板中,我們還可以通過不同的選項來選擇資料展示的形式和維度。
從這個結果中,我們可以看到不同的執行緒以及方法呼叫佔用的時間,從而可以評估出 CPU 效能的瓶頸和優化方向。
5、除此之外,我們還能在 Instruments 選擇使用 Counters
Activity
Monitor
、System Trace
等 Profiling
Template 對程式做 CPU 效能考量。
6、需要注意的是,有時候如果你使用 Instruments 檢視呼叫堆疊時可能看到的都是地址而不是函式名,這樣就不太好定位問題了。這時候你可以把相關專案的 Build Settings - Debug Information Format 的 Debug 和 Release 都設定為 DWARF
with dSYM File
,這樣就能將對應的堆疊資訊符號化顯示了。
圖形效能
關於圖形效能方面,我們平時最關注的應該就是「幀率」這個概念了。在 Instruments 中,我們可以使用 Core
Animation
+ Time Profiler
來評估圖形效能。使用步驟如下:
1、同「CPU 佔用效能測試」一樣,先在 Xcode 中對當前的專案執行 Profile (Command-I),並在開啟的對話方塊中選擇 Core
Animaiton
這個模板:
2、進入 Instruments 後,選擇正確的裝置和應用程式。
3、點選紅色按鈕執行應用程式,隨著我們操作 App 介面,就可以看到幀率的變化和資料了:
在滑動螢幕時,幀率越高表示效能越好,幀率過低則意味著螢幕可能會出現卡頓。
4、在右下角面板的 Display Settings 區域,我們可以看到多個 Debug Options:
Color Blended Layers
,這個選項選項基於渲染程度對螢幕中的混合區域進行綠到紅的高亮顯示,越紅表示效能越差,會對幀率等指標造成較大的影響。紅色通常是由於多個半透明圖層疊加引起。Color Hits Green and Misses Red
,當UIView.layer.shouldRasterize = YES
時,耗時的圖片繪製會被快取,並當做一個簡單的扁平圖片來呈現。這時候,如果頁面的其他區塊(比如 UITableViewCell 的複用)使用快取直接命中,就顯示綠色,反之,如果不命中,這時就顯示紅色。紅色越多,效能越差。因為柵格化生成快取的過程是有開銷的,如果快取能被大量命中和有效使用,則總體上會降低開銷,反之則意味著要頻繁生成新的快取,這會讓效能問題雪上加霜。Color Copied Images
,對於 GPU 不支援的色彩格式的圖片只能由 CPU 來處理,把這樣的圖片標為藍色。藍色越多,效能越差。因為,我們不希望在滾動檢視的時候,由 CPU 來處理圖片,這樣可能會對主執行緒造成阻塞。Color Immediately
,通常 Core Animation Instruments 以每毫秒 10 次的頻率更新圖層除錯顏色。對某些效果來說,這顯然太慢了。這個選項就可以用來設定每幀都更新(可能會影響到渲染效能,而且會導致幀率測量不準,所以不要一直都設定它)。Color Misaligned Images
,這個選項檢查了圖片是否被縮放,以及畫素是否對齊。被放縮的圖片會被標記為黃色,畫素不對齊則會標註為紫色。黃色、紫色越多,效能越差。Color Offscreen-Rendered Yellow
,這個選項會把那些離屏渲染的圖層顯示為黃色。黃色越多,效能越差。這些顯示為黃色的圖層很可能需要用 shadowPath 或者 shouldRasterize 來優化。Color OpenGL Fast Path Blue
,這個選項會把任何直接使用 OpenGL 繪製的圖層顯示為藍色。藍色越多,效能越好。如果僅僅使用 UIKit 或者 Core Animation 的 API,那麼不會有任何效果。如果使用 GLKView 或者 CAEAGLLayer,那如果不顯示藍色塊的話就意味著你正在強制 CPU 渲染額外的紋理,而不是繪製到螢幕。Flash Updated Regions
,這個選項會把重繪的內容顯示為黃色。不該出現的黃色越多,效能越差。通常我們希望只是更新的部分被標記完黃色。
我們可以使用這些選項,來監測更加具體的圖形效能。
5、我們還可以選擇使用 OpenGL ES Analysis
、GPU
Driver
等模板來監測圖形相關效能。
記憶體效能
Instruments 可以幫我們瞭解到應用程式使用記憶體的幾個方面:
全域性記憶體使用情況(Overall Memory Use)
: 從全域性的角度監測應用程式的記憶體使用情況,捕捉非預期的或大幅度的記憶體增長。記憶體洩露(Leaked memory)
: 未被你的程式引用,同時也不能被使用或釋放的記憶體。廢棄記憶體(Abandoned memory)
: 被你的程式引用,但是沒什麼卵用的記憶體。殭屍物件(Zombies)
: 殭屍物件指的是對應的記憶體已經被釋放並且不再會使用到,但是你的程式卻在某處依然有指向它的引用。在 iOS 中有一個 NSZombie 機制,這個是為了記憶體除錯的目的而設計的一種機制。在這個機制下,當你 NSZombieEnabled 為 YES 時,當一個對應的引用計數減為 0 時,這個物件不會被釋放,當這個物件再收到任何訊息時,它會記錄一條 warning,而不是直接崩潰,以方便我們進行程式除錯。
這裡我們介紹下查詢記憶體洩露的過程:
1、同「CPU 佔用效能測試」一樣,先在 Xcode 中對當前的專案執行 Profile (Command-I),並在開啟的對話方塊中選擇 Leaks
這個模板:
2、進入 Instruments 後,選擇正確的裝置和應用程式。
3、點選紅色按鈕執行應用程式,我們可以看到如下介面:
4、在 Display Settings 中勾選 Invert Call Tree
和 Hide
System Libraries
或其他選項可以過濾顯示的資料。
5、在導航欄的篩選框中,我們可以輸入關鍵字來篩選資料。
6、在實際使用中,我們進入一個頁面後再退出,發現相關的記憶體分配沒有清空,這時候就發生記憶體洩露了。我們檢視更細節的呼叫資訊,追蹤到可能造成記憶體洩露的程式碼位置:
7、我們還可以使用 Activity Monitor
、Allocations
、Zombies
等模板來針對性地做記憶體監測。