iOS系列教程之用instruments來檢驗你的app

看到的翻譯比較爛,看原文的同時順便紀錄下
原文鏈接
Instruments Tutorial with Swift: Getting Started
這篇教程會告訴你如何使用xcode自帶的Instruments的幾個比較重要的功能??梢宰屇銠z查你代碼中的運行問題,內存問題,循環(huán)引用和其它一些問題。

Time for Profiling

首先我們來看Time for Profiling。每個標準時間,Instruments會暫停程序的運行并且獲取每個正在運行的線程的堆棧信息。類似xocde中斷點時左邊欄show the debug navigator標簽中的線程信息。
Time Profiler中如下圖



該圖中通過Call Tree顯示了app中許多方法執(zhí)行使用的時間。每一行都是一個通過執(zhí)行路徑表明的不同方法。
此處的時間并不是嚴格的通過監(jiān)視開始結束確定的,而是通過方法在棧中停留的樣本次數(shù)確定的。舉例來說,如果1毫秒一次取100個樣本,而我們要觀察的方法在其中10個樣本中出現(xiàn)在棧頂部,那么我們就可以推斷這個方法用時大約是10毫秒,這個方法非常不嚴謹?shù)亲鳛槲覀儥z查是否有方法用時過長(找到有問題的方法)已經(jīng)完全夠用了。

提示:一般情況下,你應該使用真機而不是模擬器進行測試。模擬器基于mac的硬件,相比iOS設備過于強大,在真機中有很多限制是模擬器沒有的。

所以不需要其它的操作,時間就被紀錄下來了。
下面看看具體使用。
打開你的xcode在菜單欄中 選擇Product\Profile,或者直接快捷鍵?I。這將會編譯你的app并且載入Instruments。接下來你將會看到Instruments提供的各種模版,如下圖。



選擇Time Profiler然后點擊choose。然后會彈出一個新的Instruments界面。點擊左上角的紅色記錄按鈕開始記錄數(shù)據(jù),這時app也會在設備中打開。當然你可能會碰到需要授權的情況,點擊是就好。
在Instruments窗口中你可以看到title位置的時間正在增長,時間軸上又個小三角自左向右移動,這表明app已經(jīng)在運行了。
首先右上角把右邊欄和下邊欄都打開,如下



下面解釋各個部分

1.記錄控制。紅色的‘記錄’按鈕,控制被分析的app運行或者終止。暫停按鈕就是暫停嘍
2.運行中的計時器。顯示被分析的app運行的時間,和運行次數(shù)。如果你停止或者重新開始記錄,會開啟一個新的計時器并且顯示 Run 2 of 2。

3.這個部分叫做追蹤區(qū)域,顯示各種數(shù)據(jù)的軌跡。根據(jù)所選的Time Profiler模型,現(xiàn)在只有一個instrument所以只有一行軌跡,詳細的稍后介紹
4.詳細展示。這部分顯示你所追蹤的instrument的詳細信息。當前,它顯示的是最‘熱門’的方法--占用cpu時間最長的。
5.檢查器面板。三個檢查器:記錄設置,顯示設置,拓展詳情。
原文中有例子來說明,可以下載后按照下面順著走。例子大概是一個搜索后展示結果的列表。

實戰(zhàn)

例子用Time Profiler跑起來后,搜索個東西然后在列表中上下滑動幾次,就可以記錄到不少Time Profiler的數(shù)據(jù)。你會發(fā)現(xiàn)屏幕中間的數(shù)字變了并且有曲線圖出現(xiàn),這表示CPU周期在被使用。
如果你不希望這么繁瑣的數(shù)據(jù),只想觀看指定的可能出錯的東西,那么你需要對上面的5進行一些設置。選擇Display Settings(?+2)。在檢查器中的Call Tree中,選擇Separate by Thread, Invert Call Tree, Hide Missing Symbols 和 Hide System Libraries. 如下圖



下面解釋下這些選項都有什么用

  • Separate by Thread:每個線程分開觀察。這可以讓你知道哪個線程改為cpu的高負荷負責。
  • Invert Call Tree:字面意思,從top到bottom展示。介于你想知道CPU把時間都花到哪個深層的方法中,一般都會選這個。
  • Hide Missing Symbols:如果你app或者系統(tǒng)framework的dsym文件沒有被找到,你就不會在表區(qū)看到對應的方法名,只能看到2進制文件中對應的地址。如果選中這個,那么只有確定的標示才會被顯示出來,只有地址的會被隱藏。用來簡化分析的數(shù)據(jù)。
  • Hide System Libraries:當你選中該選項,只有你app的標示(例子中為方法)會被顯示。通常都會被選中,因為關注系統(tǒng)本身使用cpu的情況并沒有什么卵用。
  • Flatten Recursion:處理遞歸(自己調用自己),在每個棧中只跟蹤一個,而不是多個。
  • Top Functions:選中意味著,讓Instruments統(tǒng)計一個方法使用時間時,將它調用的方法的運行時間也算到里面。當A調用B,那么A的時間為A的時間加上B的。這個是很有用的,可以讓你發(fā)現(xiàn)進棧太長的元素。
  • 如果是OC的程序,這里還有個 Show Obj-C Only:如果選中,那么只會顯示oc的方法,忽略c和c++。這個沒什么卵用,除非你的app是個 OpenGL app,會有一些C++的方法。
    回到我們的例子中
    雖然原來表中好多值都好類似,一旦你設置了上面的選項就會被梳理成下面這樣



    現(xiàn)在看起來好多了。你會發(fā)現(xiàn)大量的時間被花費到applytonalfilter這個方法中,這個方法在cell每次出現(xiàn)都會被調用。
    為了知道這個方法到底在做些什么,列表中直接雙擊,會直接把代碼展示給你看。如下



    超贊,有木有。applyTonalFilter()是UIImage拓展的方法 ,時間基本都用來生成輸出圖像。
    看上去這個方法我們也做不了什么讓他變快。讓我們去看看調用這個方法的方法看看。點擊代碼上方的calltree回到列表視圖?,F(xiàn)在我們點擊applyTonalFilter這行左邊的小三角,展開調用該方法的方法。重復步驟(在swift中,層數(shù)稍微多一些)當你看到有你工程名字的一行時,有可能就找到問題了。
    例子中這一行是 cellForItemAtIndexPath,雙擊打開代碼?,F(xiàn)在你就能看到問題所在了。這個方法耗時太長,而你在cell重構填充圖片時不停的被調用造成了主線程的阻塞(UI展示在主線程中進行,所以影響到了UI流暢)。
轉進工程代碼

為了解決這個,你需要做兩步:第一將圖片處理放到后臺線程中,第二當圖片生成好后保存下來。例子中有集成緩存方法。
現(xiàn)在點擊右上角的xcode標志,飛機票直接到問題代碼。現(xiàn)在改吧。
未完待續(xù),還有其他模塊要說。不過我要先去測測我的代碼了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容