iOS性能優化:Instruments工具
前言:程序運行時常見的錯誤可分為兩類:一是用戶的使用方式引起的外部錯誤,如缺少參數或者參數錯誤;二是程序運行時產生的內部錯誤,如內存溢出,空指針,以0做除數等。對于第一點作為開發工程師沒有過多的優化點,而第二點則可以通過一些工具及時地找到問題并改之。所以熟練地使用代碼優化工具是一個軟件開發工程師必須掌握的技能。
今天筆者給大家介紹一款代碼分析優化工具:Xcode自帶的檢測調試工具Instruments。
Instruments提供了很多功能,我會重點介紹一下我最常用的幾類:
1.Time Profiler:CPU分析工具分析代碼的執行時間。
2.Core Animation:離屏渲染,圖層混合等GPU耗時。
3.Leaks:內存檢測,內存泄漏檢測工具。
4.Energy Log:耗電檢測工具。
5.Network:流量檢測工具。
使用Xcode自帶的Instruments工具首先需要打開它。
之后便可以根據想調試不同的性能來選擇對應的調試工具。
一.Time Profiler使用簡介
TimeProfiler見名知意:時間分析工具,它會按照設定的時間間隔(默認1毫秒)來跟蹤每一線程的堆棧信息(stacktrace),并通過比較時間間隔之間的堆棧狀態,來推算出某個方法執行了多久,給出一個近似值。具體步驟如下:
1.雙擊TimeProfiler進入到調試界面點擊左上角紅色原點(啟動程序按鈕)之后便可以看到如下圖的時間消耗。
但是我們發現這些信息只能顯示到底層的線程Runloop耗時,并不能幫助我們定位到具體的代碼中去,下面介紹CallTree選項的勾選操作以及含義。這些選項默認是不選的,但把它們勾選上可以幫你更快定位到關鍵的代碼上,往往這也是問題的源頭。
Separate by Thread:按線程分開做分析,這樣更容易揪出那些吃資源的問題線程。特別是對于主線程,它要處理和渲染所有的接口數據,一旦受到阻塞,程序必然卡頓或停止響應。
Invert Call Tree:反向輸出調用樹。把調用層級最深的方法顯示在最上面,更容易找到最耗時的操作。
Hide Missing Symbols:隱藏缺失符號。如果dSYM文件或其他系統架構缺失,列表中會出現很多奇怪的十六進制的數值,用此選項把這些干擾元素屏蔽掉,讓列表回歸清爽。
Hide System Libraries:隱藏系統庫文件。過濾掉各種系統調用,只顯示自己的代碼調用。
Flattern Recursion:拼合遞歸。將同一遞歸函數產生的多條堆棧(因為遞歸函數會調用自己)合并為一條。
Top Functions:找到最耗時的函數或方法。
將以上勾選之后便可以看到對應的具體代碼,此時選中一行耗時操作雙擊便可以進入到對應的代碼中并且顯示詳細的消耗時間等如下圖:
根據這些時間對應代碼便可以做一些優化,減少重復的耗時邏輯優化CPU。
二.Core Animation動畫渲染使用簡介:
CoreAnimation系要注意的一點是必須是真機調試,用于調試離屏渲染,繪圖,動畫,等操作。調試需注意以下幾個選項的勾選:
比較重要的:
·"Color Blended
Layers":圖層混合
顯示出被混合的圖層BlendedLayer(用紅色標注),BlendedLayer是因為這些Layer是透明的(Transparent),系統在渲染這些view時需要將該view和下層view混合(Blend)后才能計算出該像素點的實際顏色。所以紅色越少越好
·"Color Hits
Green and Misses Red":圖層緩存
很多視圖Layer由于Shadow、Mask和Gradient等原因渲染很高,因此UIKit提供了API用于緩存這些Layer:[layersetShouldRasterize:YES],系統會將這些Layer緩存成Bitmap位圖供渲染使用,如果失效時便丟棄這些Bitmap重新生成。所以綠色越多,紅色越少越好
·"Color
Offscreen-Rendered Yellow":離屏渲染
Offscreen-Rendering離屏渲染意思是iOS要顯示一個視圖時,需要先在后臺用CPU計算出視圖的Bitmap,再交給GPU做Onscreen-Rendering顯示在屏幕上,因為顯示一個視圖需要兩次計算,所以這種Offscreen-Rendering會導致app的圖形性能下降。所以黃色越少越好。
次要的:
·"Color
Misaligned Images":圖片縮放
MisalignedImage表示要繪制的點無法直接映射到頻幕上的像素點,此時系統需要對相鄰的像素點做anti-aliasing反鋸齒計算,增加了圖形負擔,通常這種問題出在對某些View的Frame重新計算和設置時產生的。
·"Color Copied
images":標注應用繪制時被Core Animation復制的圖片
·"Color
Immediately":Instruments在做color-flush操作時取消10毫秒的延時
·"Color
Compositing Fast-Path Blue":標記由硬件繪制的路徑
·"Flash Updated
Regions":重繪的區域
勾選這些不同的選項可以在真機上看到不同顏色的渲染標注。
三.Leaks內存調試使用簡介
Leaks是iOS程序中用來檢測內存泄漏的工具,靈活的運用Leaks可以幫助我們預防程序中的內存泄漏防止程序內存耗用過大被掛起。首先雙擊Leaks點擊左上角紅色圓點運行,并且選中CallTree,在CallTree選項中勾選InvertCallTree和HideSystemLibraries選項如下圖所示
然后程序跑起來我們觀察上方的內存變化區域,工具中按照時間把所耗內存的大小都以填充圖的形式展現出來,當鼠標移動到圖的位置時直接顯示出那一時刻所占用的內存大小,如果內存途中下方顯示出紅色叉號則代表此處存在內存泄漏。可以通過鼠標在圖中圈出此區域,此時下面的CallTree就會打印出對應的函數堆棧調用以及所占內存大小信息,雙擊便可進入到對應的代碼區域來查看。如下圖:
雙擊函數名稱進入到代碼對應的位置查看具體:
此時便可以根據代碼中對應的位置來進行內存調試工作。
四.Energy Log耗電量檢測使用簡介:
雙擊打開EnergyLog直接點擊紅色圓點運行程序,左側依次即可看到CPU活動比例,網絡活動比例,亮度狀態,手機睡眠狀態,手機連接藍牙狀態,手機連接wifi狀態,手機GPS狀態這次都是手機耗電的構成部分。如下圖:
我們也可以在Xoce啟動程序時點擊Xcode左側狀態欄,選擇EnergyImpact選項,在右側即可看到手機實時的耗電情況。如下圖:
左上部分是資源實時消耗情況儀表盤,右上部分是資源平均消耗情況,下方是資源具體消耗情況。
注意資源實時消耗情況儀表盤中指針指向的區域
綠色—合理
黃色—資源消耗高.你的程序比較耗電.
紅色—資源消耗非常高.僅僅輕度使用你的app,用戶就可以明顯感到電量在消耗。
下圖為具體電量消耗情況:
四個最主要的耗電原因,分別是CPU(喚醒及使用),Network(網絡訪問),Location(定位功能),Background(后臺運行功能)。
每秒刷新.不同功能分別的資源消耗情況.如果消耗資源小方塊顯示深灰色,沒有消耗資源的時候小方塊顯示白色。
五.Network網絡檢測使用簡介:
雙擊打開Network直接點擊紅色圓點運行程序在上方便可以看到手機網絡的輸入輸出大小,用鼠標攔截住一塊區域就可以查看這個區間內是我們的App發生的網絡消耗還是其他進程發生的,我們還可以查看到網絡請求的本地地址和服務地址,輸入和輸出的大小等信息下面將詳細介紹各種查看檢測等方式:
上圖隨便圈出一塊消耗網絡資源的地方,此時在下方有三個選項:
第一個:Processes代表查看網絡進程,也就是你的App和其他程序的使用流量總大小。
第二個:Connections代表所有的訪問網絡請求的端口,輸入輸出大小,本地地址,數據包大小,往返時間等信息。
第三個:interfaces即在用戶的角度當前手機的整體網絡使用情況(不區分線程,只區分網絡使用類型- wifi Or流量)。
1.選擇Processes
我們可以發現工具把整個網絡訪問劃分為兩部分,我們的App和其他的進程,分別顯示出它們的:
1.process:進程名。
2.data in請求數據大小。
3.packets in請求數據包大小。
4.data out發送數據大小。
5.packets out發送數據包大小。
6.duplicate Data Recv重傳數據大小。
7.out-of-Order data傳輸失敗數據大小。
8.retransmissions網絡重傳次數。
2.選擇Connections
這個選項把所有的網絡請求發生的數據交互明細都打印出來可以讓我們一目了然的發現數據來自哪里,到哪里去,大小是多少,幀率是多少等信息。
相比Processes選項Connections選項多出了
1.local代表本地訪問地址。
2.remote遠程服務地址。
3.shortest Roundtrip:最短往返時間。
4.avg. Roundtrip:平均往返時間。
3.選擇interfaces
interfaces代表在用戶層面上的手機的網絡使用情況,其中Interface選項代表網絡環境,Connections代表總體連接次數其他選項和以上意義相同。
根據以上三個選項的不同信息我們就可以全面系統的掌握我們的App和用戶當前手機的網絡使用情況。
小結:整理總結關于優化部分實在有限,如上僅供各位參考.另外Instruments確實是把分析代碼利器.目前沒有任何一個第三方工具可以去替代.推薦各位使用.
作者:Olivia_Zqy