當(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è)備來測試。

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

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

Toolbar 各部分的名稱

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ì)信息 。

對于界面的詳細(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 是一個圖片列表。

第一步判斷問題可能出現(xiàn)在哪里,因為 APP 是一個圖片列表,所以優(yōu)化的時候優(yōu)先考慮圖片加載和顯示方面的問題。
第二步使用 Instruments 來分析 APP。
運行 Time Profiler Instrument 并對 APP 做了運行情況錄制之后,按住鼠標(biāo)左鍵并拖動,截取 CPU 使用率較高的一段運行時間進(jìn)行分析。

第三步根據(jù) Instruments 分析結(jié)果做對應(yīng)的假設(shè)。
運行時間的截取確定后,可以在 Detail pane 查看運行過程中的一些 APP 細(xì)節(jié),也可以從 Inspector pane 查看更詳細(xì)的運行信息 ,從下面的截圖中可以看出一些異常狀況。
- 從 Detail pane 中可以看出主線程占用了 67.8% 的 CPU 時間
- 從 Detail pane 中可以看出主線程的工作基本都是在圖片處理操作
- 從 Inspector pane 可以看出圖片的解碼操作是在主線程完成
從上面的分析結(jié)果中,可以提出一個假設(shè),那就是 Cell 的圖片加載方法存在問題。

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

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

第五步代碼修改完成之后,接下來就是需要驗證修改是否起作用了。繼續(xù)使用 Instruments 的 Time Profiler 工具驗證。老樣子,還是運行 Time Profiler Instrument 并對 APP 做了運行情況錄制之后,截取了 CPU 使用率較高的一段運行時間進(jìn)行分析??梢园l(fā)現(xiàn)以下情況
- 從 Detail pane 中可以看出主線程占用了 20.3% 的 CPU 時間
- 從 Detail pane 中可以看出非主線程占據(jù)了較大的 CPU 時間
- 從 Inspector pane 可以看出圖片處理操作發(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é)
raywenderlich 的 Practical Instruments 課程 https://videos.raywenderlich.com/courses/74-practical-instruments/lessons/3
Apple 的官方 instruments 文檔https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html#//apple_ref/doc/uid/TP40004652-CH3-SW1
圖片處理技巧
https://developer.apple.com/videos/play/wwdc2014/419/