參考鏈接:http://www.cnblogs.com/ym123/p/4324335.html
啟動Time Profile:Xcode ——> Product ——> Profile ——> Time Profile
使用Time Profiler調試程序,能獲取到整個應用程序運行中所消耗的時間分布和百分比
使用Time Profile前有兩點需要注意的地方:
1、一定要使用真機調試
在開始進行應用程序性能分析的時候,一定要使用真機。因為模擬器運行在Mac上,然而Mac上的CPU往往比iOS設備要快。相反,Mac上的GPU和iOS設備的完全不一樣,模擬器不得已要在軟件層面(CPU)模擬設備的GPU,這意味著GPU相關的操作在模擬器上運行的更慢,尤其是使用CAEAGLLayer來寫一些OpenGL的代碼時候,這就導致模擬器性能數據和用戶真機使用性能數據相去甚遠
2、應用程序一定要使用發布配置
在發布環境打包的時候,編譯器會引入一系列提高性能的優化,例如去掉調試符號或者移除并重新組織代碼。另iOS引入一種"Watch Dog"[看門狗]機制,不同的場景下,“看門狗”會監測應用的性能,如果超出了該場景所規定的運行時間,“看門狗”就會強制終結這個應用的進程。開發者可以crashlog看到對應的日志,但Xcode在調試配置下會禁用"Watch Dog"
啟動后如圖
點擊左上角紅色按鈕,開始調試
調試時注意右下方選項
Separate by Thread:每個線程應該分開考慮,只有這樣你才能揪出那些大量占用CPU的"重"線程
Invert Call Tree:從上倒下跟蹤堆棧,這意味著你看到的表中的方法,將已從第0幀開始取樣,這通常你是想要的,只有這樣你才能看到CPU中話費時間最深的方法,也就是說FuncA{FunB{FunC}} 勾選此項后堆棧以C->B-A 把調用層級最深的C顯示在最外面
Hide System Libraries:勾選此項你會顯示你app的代碼,這是非常有用的。因為通常你只關心cpu花在你自己寫的代碼上的時間 而不是花在系統代碼上的時間
Flatten Recursion:遞歸函數, 每個堆棧跟蹤一個條目
Top Functions:一個函數花費的時間直接在該函數中的總和,以及在函數調用該函數所花費的時間的總時間。因此,如果函數A調用B,那么A的時間報告在A花費的時間加上B花費的時間,這非常有用,因為它可以讓你每次下到調用堆棧時挑最大的時間數字,歸零在你最耗時的方法
最終調試界面如圖
雙擊選中行查看代碼
發現循環中的UIImage *image = [UIImage imageNamed:imageName];語句的時間消耗最長,度娘之:
UIImage初始化方法有兩種
A:imagedNamed初始化
B:imageWithContentsOfFile初始化
二者不同之處在于,imageNamed默認加載圖片成功后會內存中緩存圖片,這個方法用一個指定的名字在系統緩存中查找并返回一個圖片對象,如果緩存中沒有找到相應的圖片對象,則從指定地方加載圖片然后緩存對象,并返回這個圖片對象
而imageWithContentsOfFile則僅只加載圖片,不緩存
大量使用imageNamed方式會在不需要緩存的地方額外增加開銷CPU的時間來做這件事,當應用程序需要加載一張比較大的圖片并且使用一次性,那么其實是沒有必要去緩存這個圖片的,用imageWithContentsOfFile是最為經濟的方式,這樣不會因為UIImage元素較多情況下,CPU會被逐個分散在不必要緩存上浪費過多時間
使用場景需要編程時,應該根據實際應用場景加以區分,UIimage雖小,但使用元素較多問題會有所凸顯
文/戴尼瑪(簡書作者)
原文鏈接:http://www.lxweimin.com/p/c6961c355ae8
著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。