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 性能考量。
圖形性能
關于圖形性能方面,我們平時最關注的應該就是「幀率」這個概念了。在 Instruments 中,我們可以使用 Core Animation
- Time Profiler
來評估圖形性能。使用步驟如下:
1、同「CPU 占用性能測試」一樣,先在 Xcode 中對當前的項目執行 Profile (Command-I),并在打開的對話框中選擇 Core Animaiton
這個模板:
image
2、進入 Instruments 后,選擇正確的設備和應用程序。
3、點擊紅色按鈕運行應用程序,隨著我們操作 App 界面,就可以看到幀率的變化和數據了:
image
在滑動屏幕時,幀率越高表示性能越好,幀率過低則意味著屏幕可能會出現卡頓。
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
或其他選項可以過濾顯示的數據。
[圖片上傳中。。。(13)]
5、在導航欄的篩選框中,我們可以輸入關鍵字來篩選數據。
6、在實際使用中,我們進入一個頁面后再退出,發現相關的內存分配沒有清空,這時候就發生內存泄露了。我們查看更細節的調用信息,追蹤到可能造成內存泄露的代碼位置:
7、我們還可以使用 Activity Monitor
、Allocations
、Zombies
等模板來針對性地做內存監測。