硬廣:《IOS性能調優系列》第五篇,預計會有二十多篇,持續更新,歡迎關注。app
以前四篇都是關注於內存方面,分析了內存泄漏、殭屍對象、內存分配,本篇介紹Time Profiler工具的使用,開始真正的「性能」調優之旅。框架
Time Profiler還有以前介紹過的Leaks、Allocations工具,被戲稱爲Instruments的救命三招,是當應用遇到問題時首先應當使用的三個工具。ide
Time Profiler幫助咱們分析代碼的執行時間,找出致使程序變慢的緣由,告訴咱們「時間都去哪兒了?」。函數
在使用Time Profiler以前,先看看原始的性能分析方法。工具
原始的性能分析方法性能
這種分析方法估計是不少開發人員第一時間想到的,寫個單元測試,在開始和結束的地方記錄時間。單元測試
示例代碼:測試
NSDate *stDate = [NSDate date]; for(int i = 0; i < 999; i++) { // do something } NSDate *endDate = [NSDate date]; NSLog(@"time:%f", [endDate timeIntervalSinceDate:stDate]);
經過計算時差,能夠算出中間消耗的時間,經過這種辦法能夠一部分一部分的對可能出現性能瓶頸的代碼進行分析。優化
這種方法的缺點有如下亮點:線程
一、測試效率過低,不少性能瓶頸是很難預估到的,須要從上層到下層進行逐步排除;
二、沒法對界面渲染的效率進行測試,找出界面性能瓶頸;
三、NSLog的分析不夠精確,可能在模擬器上因爲開發設備性能速度快,沒法明顯區分出性能瓶頸。
這也是使用Time Profiler工具的優點,能以極高的效率找出性能瓶頸。
使用Time Profiler的性能分析方法
Time Profiler分析原理:它按照固定的時間間隔來跟蹤每個線程的堆棧信息,經過統計比較時間間隔之間的堆棧狀態,來推算某個方法執行了多久,並得到一個近似值。其實從根本上來講與咱們的原始分析方法殊途同歸,只不過其將各個方法消耗的時間統計起來。
和使用 Instruments的其餘工具同樣,點擊XCode的Product菜單Profile啓動Instruments:
選擇Time Profiler工具開始測試,這時會自動啓動模擬器和Time Profiler錄製。
先進行一些App的操做,讓Time Profiler收集足夠的數據,尤爲是你以爲那些有性能瓶頸的地方。
四、五、6所標記的面板是須要關注的:
4是擴展面板,用來跟蹤顯示堆棧;5是詳細地面板,能夠從這裏看到cpu運行的時間都消耗在哪裏;6是選項面板,能夠用來設置Time Profiler的運行參數。
經過對應用的操做,能夠在詳細面板中看到那些最耗時的操做是哪些,並能夠逐行展開查看:
圖標爲黑色頭像的就是Time Profiler給咱們的提示,有可能存在性能瓶頸的地方,能夠逐漸向下展開,找到產生的根本緣由。
好比咱們經過分析,發現[CMTool getNewsTimeFromLong]這個時間格式化函數可能須要優化。
固然這裏只是舉一個例子,性能調優應該首先從總體到細節的順序進行,才能收到最明顯的效果。
Time Profiler參數設置
這裏邊幾個選項的含義以下:
Separate by Thread: 每一個線程應該分開考慮。只有這樣你才能揪出那些大量佔用CPU的"重"線程
Invert Call Tree: 從上倒下跟蹤堆棧,這意味着你看到的表中的方法,將已從第0幀開始取樣,這一般你是想要的,只有這樣你才能看到CPU中話費時間最深的方法.也就是說FuncA{FunB{FunC}} 勾選此項後堆棧以C->B-A 把調用層級最深的C顯示在最外面
Hide Missing Symbols: 若是dSYM沒法找到你的app或者系統框架的話,那麼表中看不到方法名只能看到十六進制的數值,若是勾線此項能夠隱藏這些符號,便於簡化數據
Hide System Libraries: 勾選此項你會顯示你app的代碼,這是很是有用的. 由於一般你只關心cpu花在本身代碼上的時間不是系統上的
Show Obj-C Only: 只顯示oc代碼 ,若是你的程序是像OpenGl這樣的程序,不要勾選側向由於他有多是C++的
Flatten Recursion: 遞歸函數, 每一個堆棧跟蹤一個條目
Top Functions: 一個函數花費的時間直接在該函數中的總和,以及在函數調用該函數所花費的時間的總時間。所以,若是函數A調用B,那麼A的時間報告在A花費的時間加上B花費的時間,這很是真有用,由於它可讓你每次下到調用堆棧時挑最大的時間數字,歸零在你最耗時的方法。
上面的參數在實踐中合理設置,也沒有什麼太多技巧,就是經過數據的隱藏、顯示讓咱們更關注於想找到的數據。
天下應用,惟快不破!尤爲是手機應用,更應該注意用戶體驗和響應速度。
記錄,爲更好的本身!