使用Instruments的工具

iOSXcodeInstrumentsInstruments是一個官方提供的強大的性能調試工具集。

1.Blank(空模板):創建一個空的模板,可以從Library庫中添加其他模板;
2.Activity Monitor(活動監視器):監控進程的CPU,內存,磁盤,網絡使用情況 是程序在手機運行真正占用的內存大小
3.Allocations(內存分配):跟蹤過程的匿名虛擬內存和堆的對象提供類名和可選保留/釋放歷史;
4.Cocoa Layout 觀察NSLayoutConstraint對象的改變,幫助我們判斷什么時間什么地點的constraint是否合理
5.Core Animation(圖形性能)這個模塊顯示程序顯卡性能以及CPU使用情況
6.CoreData 這個模塊跟蹤Core Data文件系統活動
7.Counters 收集使用時間或基於事件的抽樣方法的性能監控計數器(PMC)事件 ?
8.Energy Log 耗電量監控
9.File Activity 檢測文件創建,移動,變化,刪除等
10.Leaks(泄漏):一般的措施內存使用情況,檢查泄漏的內存,並提供了所有活動的分配和泄漏模塊的類對象分配統計信息以及內存地址歷史記錄;
11.Metal System Trace (Metal API是apple 2014年在ios平台上推出的高效底層的3D圖形API,它通過減少驅動層的API調用CPU的消耗提高渲染效率。
12.Network 用鏈接工具分析你的程序如何使用TCP/IP和UDP/IP鏈接
13.OpenGL ES Analysis 這個模塊測量分析OpenGL ES活動正確性檢測以及表現問題,提供解決建議
14.System Trace 系統跟蹤,通過顯示當前被調度線程提供綜合的系統表現,顯示從用戶到系統的轉換代碼通過兩個系統調用或內存操作
15.System Usage 這個模板記錄關於文件讀寫,sockets,I/O系統活動, 輸入輸出
16.Time Profiler(時間探查):執行對系統的CPU上運行的進程低負載時間為基礎采樣。
17.Zombies 測量一般的內存使用,專注於檢測過度釋放的野指針對象,也提供對象分配統計,以及主動分配的內存地址歷史
常用的有
Leaks,Zombies,Core Animation,Time Profiler,Cocoa Layout,Energy Log,Network
一.Core Animation:
通過聯調真機,可以觀察到運行時每秒繪制了多少幀(60幀封頂,30幀以下可以感覺到卡頓越低越需要優化):
1.選中Color Blended Layers, 可以得到界面的紅綠分布,其中紅色的為透明部分,紅色部分越多對性能影響越大。
注意 xcode 版本不同 Color Blended Layers位置也不同 具體看下面的圖片
2.監測離屏渲染:
Color Offscreen-Rendered Yellow
Color Hits Green and Misses Red
看一下淘寶的

Xcode8.3.2 的在下面

注意,XCode 9.3 之后在這里了哦 真機run起來,就可以了,不用打開調試工具

二.性能監控計數器Counters
(CPU Samples 操作是會高,不操作時低切穩定,邊玩手機邊觀察,可以看得到CPU的name )

三,Energy Log
耗電量監控 (可以看到手機的WiFi狀態,藍牙狀態等等)

四,Leaks
Leaks一個進程占用的內存空間,包括5種數據區:
(1)BSS段:通常存放未初始化的全局變量
(2)數據段:通常存放已初始化的全局變量
(3)代碼段:存放程序執行代碼
(4)堆:存放進程運行中被動態分配的內存段,如OC對象等
(5)棧:由編譯器自動分配釋放,存放函數參數,局部變量等
Analyze-靜態分析
檢測出的常見的三種泄露
(1).創建了對象沒有使用。
(2).創建了對象,且初始化了,但初始化的值一直沒有讀取過。
Value store to ‘X’during its initialization is never.
(3).Potential leak of an object stored into 'XX'* 。 翻譯一下:XX對象的內存單元有潛在的泄露風險。
product ——> Analyze就可以進行靜態的內存分析了(或者鼠標左鍵長安運行按鈕的右下角切換到Analyze模式)


Allocations是檢測程序運行過程中的內存分配情況的。模板中一個叫(分配)Allocations,以及一個被稱為VM Tracker(虛擬機跟蹤)。
Allocations可以幫助我們查看全局內存使用情況(Overall Memory Use): 從全局的角度監測應用程序的內存使用情況,捕捉非預期的或大幅度的內存增長。
內存泄漏使用Leaks檢測,如果對象發生內存泄漏,detail panel 中會看到對象的retain release歷史記錄,如果非對象發生內存泄漏,就會看到malloc和free的調用歷史。
1.選中Leaks Checks,在Details所在欄中選擇CallTree
2.Call Tree會給我們大概的位置,有時候會給我們精確的位置,選中出現內存泄漏的區域,縮小范圍,篩選數據。
3.且在右下 Display Settings 中勾選 Invert Call Tree 和 Hide System Libraries 或其他選項可以過濾顯示的數據。
4.在導航欄的篩選框中,我們可以輸入關鍵字來篩選數據。
5.雙擊人頭就可以進去對應得函數進行調優

五,Time Profiler
當點擊Time Profiler應用程序開始運行后. 就能獲取到整個應用程序運行 消耗時間分布 和 百分比.
使用前須知
1.Time Profiler..:
,,MacMacCPUiOSMacGPUiOSCPUGPUGPUCAEAGLLayerOpenGL. .
2. .
在發布環境打包的時候,編譯器會引入一系列提高性能的優化,例如去掉調試符號或者移除並重新組織代碼.另iOS引入一種"Watch Dog"[看門狗]機制.
不同的場景下,“看門狗”會監測應用的性能。如果超出了該場景所規定的運行時間,“看門狗”就會強制終結這個應用的進程.
開發者可以crashlog看到對應的日志.但Xcode在調試配置下會禁用"Watch Dog".


六、查找野指針 Zombies(沒怎么用)
在開啟ARC后,可以很大程度上避免產生EXC_BAD_ACCESS錯誤,但也是有出現可能的,比如非NSObject對象的產生的野指針。
1.使用Zombies工具,啟動Zombies后在內部設置了NSZombieEnabled為True。
啟用了NSZombieEnabled的話,它會用一個僵屍來替換默認的dealloc實現,也就是在引用計數降到0時,該僵屍實現會將該對象轉換成僵屍對象。
僵屍對象的作用是在你向它發送消息時,就不會向之前那樣Crash或者產生 一個難以理解的行為,而是放出一個錯誤消息,它會顯示一段日志並自動跳入調試器,
因此我們就可以找到具體或者大概是哪個對象被錯誤的釋放了。
基本上通過查看Zombies工具給出的信息找出錯誤代碼行是比較簡單的,Zombies也只有在產生EXC_BAD_ACCESS錯誤時才有用。

參考:
http://www.jianshu.com/p/8dfc477e9d70
http://www.jianshu.com/p/be59588327d5
http://www.jianshu.com/p/2ed69864ea02
