Instruments 之 Time Profiler 使用

當(dāng) APP 開發(fā)到了一定的階段,性能優(yōu)化這個話題就會被提起,性能優(yōu)化的途徑有很多,不過通常都會使用到 Apple 官方提供的 Instruments 工具。這個博客我就利用 raywenderlich 的一個代碼案例 Catstagram 來介紹 Time Profiler 這個 Instrument 的使用(詳見參考部分)。

性能優(yōu)化的常用步驟

在對 APP 進(jìn)行性能優(yōu)化的過程中,我們肯定是會針對一些 APP 存在的問題來針對性優(yōu)化的,比如 APP 啟動速度慢,大數(shù)據(jù)量列表滑動卡頓,列表圖片加載過程卡頓 。第一步?jīng)Q定了要優(yōu)化的點之后。第二步就是使用 Instruments 來分析 APP 了 ,值得注意的是 Instruments 并不能幫我們完成優(yōu)化,只是幫助我們分析 APP 運行過程的各種性能參數(shù)。第三步就是根據(jù) Instruments 分析結(jié)果做對應(yīng)的假設(shè),假設(shè)是我們的某段代碼導(dǎo)致了性能問題。第四步就是修改導(dǎo)致性能問題的某段代碼。修改完之后呢?當(dāng)然是要驗證修改的效果了,所以第五步是驗證修改效果,若是達(dá)不到效果,那么就從第一步繼續(xù)重新開始。在這個過程中最好使用性能最差最爛的設(shè)備,不要使用性能太好或者性能一般的設(shè)備來測試。

raywenderlich Instruments workflow

Time Profiler 界面介紹

快捷鍵 command + I 打開 Instruments 界面,選擇 Time Profiler 模板


Instruments 界面

每個 Instrument 的界面輪廓都是相似的,都是分為 Toolbar , Timeline pane , Detail pane , Inspector pane 這個模塊。


Instrument的界面輪廓

Toolbar 各部分的名稱


Paste_Image.png

Timeline pane , Detail pane , Inspector pane 這幾個模塊的內(nèi)容和使用的 Instrument 關(guān)系比較大,下圖是使用 Time Profiler 的各模塊細(xì)節(jié)。對于 Time Profiler 來說,它的 Timeline pane 默認(rèn)展示的是 CPU 的使用,Detail pane 默認(rèn)展示的是 APP 中各個線程的方法調(diào)用,Inspector pane 展示的是被選中的 Symbol 的詳細(xì)信息 。


Time Profiler 使用過程圖

對于界面的詳細(xì)介紹可以參考 Apple 的官方文檔 https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html#//apple_ref/doc/uid/TP40004652-CH3-SW1 ,該文檔對Instruments 各個工具界面以及基本使用方法做了詳細(xì)介紹。

Time Profiler 使用

下圖是 APP 的一個截圖,該 APP 是一個圖片列表。


APP 截圖

第一步判斷問題可能出現(xiàn)在哪里,因為 APP 是一個圖片列表,所以優(yōu)化的時候優(yōu)先考慮圖片加載和顯示方面的問題。

第二步使用 Instruments 來分析 APP。
運行 Time Profiler Instrument 并對 APP 做了運行情況錄制之后,按住鼠標(biāo)左鍵并拖動,截取 CPU 使用率較高的一段運行時間進(jìn)行分析。


Paste_Image.png

第三步根據(jù) Instruments 分析結(jié)果做對應(yīng)的假設(shè)。
運行時間的截取確定后,可以在 Detail pane 查看運行過程中的一些 APP 細(xì)節(jié),也可以從 Inspector pane 查看更詳細(xì)的運行信息 ,從下面的截圖中可以看出一些異常狀況。

  1. 從 Detail pane 中可以看出主線程占用了 67.8% 的 CPU 時間
  2. 從 Detail pane 中可以看出主線程的工作基本都是在圖片處理操作
  3. 從 Inspector pane 可以看出圖片的解碼操作是在主線程完成

從上面的分析結(jié)果中,可以提出一個假設(shè),那就是 Cell 的圖片加載方法存在問題。

詳細(xì)信息

第四步修改代碼
由于是演示 Time Profiler 的使用,所以這里只是簡單過一下代碼。
找到設(shè)置圖片的代碼位置,該代碼是在主線程給一個 UIImageView 對象設(shè)置 UIImage 對象,圖片的解碼操作是在主線程中進(jìn)行的。


需要優(yōu)化的代碼

代碼改進(jìn)后是這樣的,創(chuàng)建一個自定義 View 叫做 AsyncImageView,在這個View里面封裝了圖片的解碼操作,這個解碼操作在非主線程執(zhí)行。

改進(jìn)后的代碼

第五步代碼修改完成之后,接下來就是需要驗證修改是否起作用了。繼續(xù)使用 Instruments 的 Time Profiler 工具驗證。老樣子,還是運行 Time Profiler Instrument 并對 APP 做了運行情況錄制之后,截取了 CPU 使用率較高的一段運行時間進(jìn)行分析??梢园l(fā)現(xiàn)以下情況

  1. 從 Detail pane 中可以看出主線程占用了 20.3% 的 CPU 時間
  2. 從 Detail pane 中可以看出非主線程占據(jù)了較大的 CPU 時間
  3. 從 Inspector pane 可以看出圖片處理操作發(fā)生在非主線程
主線程占用 CPU 時間少
圖片處理操作發(fā)生在非主線程

總結(jié)

從結(jié)果可以看出,優(yōu)化的點是對的,代碼改動是生效的。為了讓界面滑動更順暢,我們通常會將部分工作從主線程轉(zhuǎn)移到非主線程來,以保證主線程不卡頓。Time Profiler 這個 instrument 幫助分析 APP 的運行情況,通過分析這個 instrument 的結(jié)果,我們可以做出優(yōu)化決策,然后實現(xiàn)這個決策并驗證,最終實現(xiàn)我們的需求。

參考

這篇文章是我看了 raywenderlich 的 Practical Instruments 課程產(chǎn)生的一個筆記,主要是介紹 Time Profiler 這個 instrument 的使用思路,代碼案例均來自于這個課程,感謝 raywenderlich 這個超級棒的平臺。隨著 Xcode 版本的更新,instruments 也是在不斷的發(fā)生變化,但是整個 instruments 的使用思路是不變的,關(guān)于新增的變化可以參考 Apple 的官方 instruments 文檔,里面也有很多關(guān)于 instruments 的使用細(xì)節(jié)

  1. raywenderlich 的 Practical Instruments 課程 https://videos.raywenderlich.com/courses/74-practical-instruments/lessons/3

  2. Apple 的官方 instruments 文檔https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html#//apple_ref/doc/uid/TP40004652-CH3-SW1

  3. demo https://files.betamax.raywenderlich.com/attachments/videos/785/a5dcec4a-da6d-428a-9874-ddb3b561e870.zip

  4. 圖片處理技巧
    https://developer.apple.com/videos/play/wwdc2014/419/

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容