同窗,我這裏有一個iOS面試的加分項,你要不要了解一下?

使用 Instruments 作 iOS 程序性能調試 cover SamirChenios

Instruments 是 Xcode 的一個工具集,爲咱們提供了強大的程序性能分析及測試能力。使用 Instruments 你能夠作下面這些事:緩存

檢查一個或多個應用或進程的行爲。 檢查設備相關的功能,好比:Wi-Fi、藍牙等。 在真機或模擬器上進行性能測試。 建立自定義的 DTrace 來分析系統以及應用的各類行爲。 跟蹤源碼中的問題。 對 App 進行性能分析。 查找 App 中的內存問題,好比:內存泄露(Leaked memory)、廢棄內存(Abandoned memory)、殭屍(zombies)等。 給出程序優化的建議。 進行系統級別的問題定位。 經過腳本記錄一個用戶行爲序列,從而能夠經過運行腳本對你的 iOS 應用進行可重複屢次的自動化測試。 保存測試配置模板以供複用。 能夠看到 Instruments 功能不少,這裏先介紹一下咱們在開發中經常使用到的幾種:CPU 性能測試、圖形性能測試、內存性能測試。ide

雖然 Instruments 是 Xcode 的一個工具集,可是它是以一個獨立的 App 的形式存在的,你能夠在 Xcode -> Open Developer Tool -> Instruments 中打開它。函數

CPU 性能工具

要看程序執行時間性能,主要有下面幾步:性能

一、先在 Xcode 中對當前的項目作 Profile (Command-I):測試

這時就會打開 Profiling Template 選項對話框:優化

二、選擇 Time Profiler 這個模板,並點擊 Choose 按鈕。ui

三、進入 Instruments 後,選擇正確的設備和應用程序:線程

四、點擊紅色按鈕運行後,就能獲得 CPU 性能的結果了:

咱們還能在時間軸面板裏面去選擇一段時間來查看該時間段裏更爲細節的 CPU 性能:

同時在中間的導航條以及右下角的控制面板中,咱們還能夠經過不一樣的選項來選擇數據展現的形式和維度。

從這個結果中,咱們能夠看到不一樣的線程以及方法調用佔用的時間,從而能夠評估出 CPU 性能的瓶頸和優化方向。

五、除此以外,咱們還能在 Instruments 選擇使用 Counters、Activity Monitor、System Trace 等 Profiling Template 對程序作 CPU 性能考量。

六、須要注意的是,有時候若是你使用 Instruments 查看調用堆棧時可能看到的都是地址而不是函數名,這樣就不太好定位問題了。這時候你能夠把相關項目的 Build Settings - Debug Information Format 的 Debug 和 Release 都設置爲 DWARF with dSYM File,這樣就能將對應的堆棧信息符號化顯示了。

圖形性能

關於圖形性能方面,咱們平時最關注的應該就是「幀率」這個概念了。在 Instruments 中,咱們可使用 Core Animation + Time Profiler 來評估圖形性能。使用步驟以下:

一、同「CPU 佔用性能測試」同樣,先在 Xcode 中對當前的項目執行 Profile (Command-I),並在打開的對話框中選擇 Core Animaiton 這個模板:

二、進入 Instruments 後,選擇正確的設備和應用程序。

三、點擊紅色按鈕運行應用程序,隨着咱們操做 App 界面,就能夠看到幀率的變化和數據了:

在滑動屏幕時,幀率越高表示性能越好,幀率太低則意味着屏幕可能會出現卡頓。

四、在右下角面板的 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,這個選項會把重繪的內容顯示爲黃色。不應出現的黃色越多,性能越差。一般咱們但願只是更新的部分被標記完黃色。 咱們可使用這些選項,來監測更加具體的圖形性能。

五、咱們還能夠選擇使用 OpenGL ES Analysis、GPU Driver 等模板來監測圖形相關性能。

內存性能

Instruments 能夠幫咱們瞭解到應用程序使用內存的幾個方面:

全局內存使用狀況(Overall Memory Use): 從全局的角度監測應用程序的內存使用狀況,捕捉非預期的或大幅度的內存增加。 內存泄露(Leaked memory): 未被你的程序引用,同時也不能被使用或釋放的內存。 廢棄內存(Abandoned memory): 被你的程序引用,可是沒什麼卵用的內存。 殭屍對象(Zombies): 殭屍對象指的是對應的內存已經被釋放而且再也不會使用到,可是你的程序卻在某處依然有指向它的引用。在 iOS 中有一個 NSZombie 機制,這個是爲了內存調試的目的而設計的一種機制。在這個機制下,當你 NSZombieEnabled 爲 YES 時,當一個對應的引用計數減爲 0 時,這個對象不會被釋放,當這個對象再收到任何消息時,它會記錄一條 warning,而不是直接崩潰,以方便咱們進行程序調試。 這裏咱們介紹下查找內存泄露的過程:

一、同「CPU 佔用性能測試」同樣,先在 Xcode 中對當前的項目執行 Profile (Command-I),並在打開的對話框中選擇 Leaks 這個模板:

二、進入 Instruments 後,選擇正確的設備和應用程序。

三、點擊紅色按鈕運行應用程序,咱們能夠看到以下界面:

四、在 Display Settings 中勾選 Invert Call Tree 和 Hide System Libraries 或其餘選項能夠過濾顯示的數據。

五、在導航欄的篩選框中,咱們能夠輸入關鍵字來篩選數據。

六、在實際使用中,咱們進入一個頁面後再退出,發現相關的內存分配沒有清空,這時候就發生內存泄露了。咱們查看更細節的調用信息,追蹤到可能形成內存泄露的代碼位置:

七、咱們還可使用 Activity Monitor、Allocations、Zombies 等模板來針對性地作內存監測。

參考

Instruments User Guide

相關文章
相關標籤/搜索