1. 程式人生 > >Instruments--iOS組建與框架——iOS SDK高階特性剖析

Instruments--iOS組建與框架——iOS SDK高階特性剖析

Instruments是Xcode自帶的15個剖析和分析工具的統稱,這些工具如表25.1所示。要詳細介紹這些工具(instrument),需要一部專著;但對普通的iOS開發人員來說,對如何使用和解讀這些工具有基本瞭解就夠了。

表25.1 Xcode提供的工具及其功能

工具 描述
Allocations 跟蹤內堆存分配,以測量堆記憶體的使用情況
Leaks 度量記憶體使用情況、檢查記憶體洩漏並提供有關物件分配的統計資訊
Activity Monitor 監視系統活動,包括CPU、記憶體、磁碟、網路和統計資訊
Zombies 度量記憶體使用情況,但專注於檢測被過度釋放(over-released)的“殭屍”物件。還按類提供有關物件分配的統計資訊以及所有物件分配的記憶體地址記錄
Time Profiler 對系統CPU執行的程序進行基於時間的取樣,開銷很低
System Trace 提供有關係統行為的資訊:指出執行緒被排程的時間以及從使用者程式碼到系統程式碼的切換
Automation 執行一個指令碼,以模擬使用者與iOS應用UI的互動
File Activity 監視檔案和目錄活動,包括開啟或關閉檔案、檔案訪問許可權修改、目錄建立、檔案移動等
Core Data 跟蹤Core Data檔案系統活動,包括檢索、快取缺失次數(cache misses)和儲存
Energy Diagnostics 提供有關能耗的診斷資訊以及主要裝置部件的開關狀態
NetWork 分析TCP/IP和UDP/IP連線的使用情況
System Usage 記錄單個程序中與檔案、套接字和共享記憶體相關的I/O系統活動
Core Animation 對使用Core Animation的程序和圖形效能和CPU使用情況進行監視
OpenGL ES Driver 度量程序的OpenGL ES圖形效能和CPU使用情況
OpenGL ES Analysis 度量和分析OpenGL ES活動,以檢測OpenGL ES錯誤和效能問題,還就如何解決這些問題提供建議

1 Instruments的介面

要在Xcode中訪問Instruments,可選擇目標裝置(模擬器或實際裝置),再選擇選單product>Profile。這將開啟如圖1視窗。選擇工具後,還可使用庫新增其他工具,如圖2所示。

1.選擇要在剖析模式下執行應用後執行的工具

Instruments介面包含多個部分,這些部分的具體情況隨當前執行的工具而異。

Instruments視窗頂部是工具欄,其中包含各種控制元件,如用於暫停、記錄和重新執行當前目標的按鈕;還可從當前執行的所有程序中選擇新目標。另外,還可指定檢查範圍,將不在左、右標記之間的內容排除在外。

Instruments會儲存應用每次執行的資料,讓您一眼就能看出兩次執行之間的效能有何不同。您還可以使用庫新增新工具,以同時進行多項測試。左邊的檢視包含選定工具的設定,可使用檢視按鈕顯示/隱藏該檢視。底部的檢視包含正在執行的測試的詳細資訊,如Call Tree或Statistics;這個檢視顯示的資訊也隨選定的工具而異。最後一個檢視史上右邊的擴充套件資訊檢視,通常包含中間檢視中選定項的棧跟蹤。

2.Instruments的基本使用者介面(這裡執行的工具是Allocations)

對於中間檢視或右邊檢視顯示的基本物件,大多可通過雙擊來顯示額外資訊,如相應的程式碼段。要熟悉工具的更詳細資訊,可單擊工具名旁邊的i按鈕。

在接下來的兩小節中,將探討兩個最常用的工具。第一個是Time Profiler,開發人員使用它來確定執行應用的哪些程式碼花費的時間最長。通過分析執行每行程式碼花費的時間,開發人員可對花費的時間最長的程式碼進行優化和改進,以提高應用的總體速度和效能。要探討的第二個工具集是Leaks和Allocations,它們讓開發人員能夠分析應用的記憶體使用情況,輕鬆地找出記憶體洩漏以及被過度釋放的物件。

2.探索Instruments:Time Profiler

在程式碼執行速度方面,Time Profiler提供了具體到行的資訊。可能導致應用速度緩慢的瓶頸很多,從等待網路呼叫完成到過度頻繁地讀寫儲存器。然而,一種導致效能問題的常見原因是過度使用CPU,這種問題也最容易解決。Time Profile向開發人員提供各種呼叫佔用的CPU時間,讓開發人員能夠將重點放在有問題的地方,進而改善效能。

Time Profiler可從工具模版列表中選擇,它可在模擬器上執行,也可在裝置上執行。剖析CPU使用情況時,千萬別忘了裝置通常比模擬器慢得多,而使用者是在裝置而非模擬器上執行軟體。

對於CPU使用率極高的應用,Time Profiler的分析結果類似於3所示。頂部的紫色圖形指出了CPU使用率,拖曳時間條可獲悉特定時間的CPU使用率。呼叫樹指出,99.6%的處理時間消耗在Main Thread上;進一步展開後發現,99.1%的時間消耗在main()上。這種資訊好像幫助不大,因為Objective-C應用的很大一部分時間就應該消耗在main()上,但開發人員據此可以知道CPU使用率特別高,有時甚至高達100%。

3應用的CPU使用率極高時,工具Time Profiler的分析結果

要從Time Profiler獲取更有用的資訊,首先應反轉呼叫樹,即選擇Time Profiler設定中的複選框Invert Call Tree。這樣,將沿呼叫樹從下往上(而不是從上往下)顯示方法消耗的時間。除反轉呼叫樹外,取消選擇複選框Hide System Libraries也很有幫助。雖然系統呼叫可能消耗大量的處理時間,但歸根結底是由開發人員編寫的程式碼導致的。檢視系統呼叫通常有助於排除比較棘手的問題。根據編寫程式碼時是否使用了Objective-C,選中複選框Show Objc-C Only可能也有所幫助。

進行合適的配置後,列表中將只有開發人員呼叫的方法以及這些方法佔用的CPU時間。一種最佳實踐是,先對啟用CPU時間最多的程式碼進行優化,因為解決了一個大問題後,很多較小的問題常常會隨之消失。要獲悉程式碼的更詳細資訊,可在呼叫樹中雙擊要調查的項。這將開啟程式碼檢查器,其中有一些標註,指出了各行程式碼的處理時間佔整個方法的處理時間的百分比,如圖4所示

4在按行顯示Time Profiler資訊

注意:
在Instruments程式碼檢查器中,不能對程式碼進行編輯;但單擊Xcode圖示,將在Xcode中開啟程式碼。

雖然Time Profiler沒有聰明到就如何優化執行緩慢的程式碼提出建議的程度,但它向開發人員指明瞭方向。雖然並非每行程式碼都有優化的空間,但知道各行程式碼佔用的處理時間後,應用優化起來就容易得多了。

提示:
使用Instruments的檢查範圍設定可指定要調查的時段;其中的左、右標記可用於指定檢查範圍的開始時間和結束時間。

3.探索Instruments:Leaks
通過結合使用工具Leaks和Allocations,開發人員可獲悉大量有助於找出並解決記憶體問題的資訊,這些問題包括過度使用記憶體、記憶體洩漏、保留迴圈以及其他與記憶體相關的問題。隨著自動引用計數(ARC)的使用日益廣泛,工具Leaks和Allocations漸漸地風光不在了,但依然對開發人員大有幫助。

像Time Profiler一樣,也可通過工具模版列表啟動Leaks。Leaks啟動後,將自動新增工具Allocations,這兩個工具都可在裝置和模擬器上執行。在圖5中,對一個性能不佳的應用進行了剖析,Allocations部分的圖形表明,它佔用的記憶體越來越多;另外,Leaks部分的紅條表明,發生了多次記憶體洩漏。只要時間足夠長,這些問題將導致應用耗盡記憶體進而奔潰。

除錯記憶體問題是,雖然也可以像前一小節那樣檢視呼叫樹資訊,但有時檢視Statistics或Leaks資訊更有幫助。要檢視記憶體洩漏資訊(記憶體洩漏常常導致佔用的記憶體越來越多),可選擇左上角的工具Leaks。在這個示例專案中,UIImage物件洩漏了大量記憶體,如圖6所示。

5.使用工具Leaks和Allocations剖析存在記憶體洩漏的專案

6.UIImage物件洩漏了大量記憶體,導致示例專案佔用的記憶體越來越多
Instruments嘗試基於棧跟蹤歸併記憶體洩漏,但這個系統並不完美,可能多次列出同一個問題導致的記憶體洩漏。具體做法是,首先解決導致記憶體洩漏最多的問題,然後再次對應用進行剖析。要找出導致記憶體洩漏的程式碼,需要顯示右邊的檢視,為此可使用Instruments工具欄中的檢視按鈕。選擇記憶體洩漏項,右邊的檢視將顯示棧跟蹤;然後雙擊非系統呼叫(通常顯示為黑色),這將顯示記憶體洩漏的程式碼。

提示:
要進一步配置工具Allocations,如啟用Zombies,可單擊它右邊的i按鈕。使用Zombies可找出並修復過度釋放的問題。過度釋放指的是試圖訪問已釋放(保留計數為零)的物件,這通常會導致應用EXC_BAD_ACCESS而奔潰。

有時候,應用消耗的記憶體增加到了無法接受的程度,但並不存在記憶體洩漏。這是由於應用使用的記憶體超過了可用記憶體。要排除這種問題,可選擇工具Allocations,再顯示呼叫樹資訊。像前一小節一樣,這裡反轉呼叫樹、隱藏系統庫且只顯示Obj-C呼叫會有所幫助。在圖7中,cellForRowAtIndexPath:分配了27.12MB記憶體,導致應用的效能不佳。雙擊它開啟程式碼檢查器,其中指出了消耗記憶體最多的程式碼行,為您排除問題指明瞭方向。

7.Allocations的呼叫樹資訊表明,cellForRowAtIndexPath:消耗了大量記憶體
5.更深入地瞭解Instruments

Instruments非常複雜,但明白基本功能和用法後,開發人員就能舉一反三,輕鬆地使用其中的大部分工具。Apple一直在不斷的改進Instruments,並敦促開發人員充分利用它。當前,Instruments提供了對應用的各個方面(從Core Data到耗電量)進行剖析的工具,還有幫助優化Core Animation和OpenGL ES動畫的工具。要更深入地瞭解Instruments提供的工具,請參閱Apple線上文件,網址為Apple線上文件Instruments

但願本章激發了您的熱情,從此一生都醉心於最大限度地優化程式碼和排除微妙的bug。一個開發人員如果能夠快速而高效地排除故障、優化和除錯程式碼,就根本不用為找工作發愁,也不必擔心自己對團隊沒有價值。

文章內容來源:
iOS組建與框架——iOS SDK高階特性剖析