檢測和診斷卡頓問題 & 診斷電量和性能迴歸

一:卡頓

什麼是Hang?

試想這樣的場景:當用戶在你的APP中進行交互時,APP卻沒有及時的響應用戶的操做。git

這種體驗能夠被描述爲延時、慢、卡頓,在Apple開發中,咱們稱這種無響應的表現爲Hang。github

(舒適提示:本片內容來源自WWDC21:Understand and eliminate hangs from your app)和 Diagnose Power and Performance regressions in your app數據庫

想了解更多WWDC2021內容的小夥伴,能夠閱讀我如下文章,歡迎多多交流和指正緩存

一文帶你讀完WWDC21核心(新)技術點性能優化

APP終極性能生存指南markdown

檢測和診斷內存問題網絡

理解main runloop

用戶的交互均在主線程的Runloop發生。當用戶和APP交互,主線程會接受到這個事件,接下來處理這個事件,而後更新UI。app

2.png

若是處理事件耗費的很長時間,就從用戶交互到UI更新之間會發生延時(delay)。異步

3.png

Hang一般由什麼引發?

4.png

  • 主線程任務忙(Busy)ide

    例如:過渡加載資源。當前頁面中只須要展現前4個圖片,可是卻一次性加載了全部的圖片。

    5.png

    例如:執行了與主線程不相關的任務。

    6.png

    再好比了使用次優的API。像繪製圖片圓角有兩種方法:

    • 方法一:

      7.png

    • 方法二:

      8.png

    比較這兩種方法,法一是CPU密集型操做,會消耗大量內存。法二使用GPU進行繪製,更快更及時。

  • 主線程阻塞(Blocked)

    可能致使主線程阻塞的操做,例如:

    • 同步請求網絡,並等待數據返回

    • 文件IO等訪問系統資源的行爲

      9.png

    • 數據庫操做

    • 10.png

      11.png

如何診斷Hang

  • 使用Instruments,排查線下的問題

    • Time Profile

      12.png

  • 使用MetricKit,檢測線上的狀況

    13.png

若是治理Hang?

核心目標:減輕主線程的工做

  • 優化必需在主線程中執行的任務

    • 使用緩存

      例如:由其餘線程負責保存和更新緩存,主線程只負責讀

      14.png

    • 使用Notification

      在主線程中發送通知,其餘線程接受通知並異步處理數據

      15.png

  • 移除主線程沒必要要的任務

    一般來講,爲UI提供關鍵信息的任務,應該在主線程執行。此外,全部的View和View Controller必須在主線程建立、修改和銷燬。

    而計算任務能夠在其餘線程執行,而後在主線程同步UI。一些不重要的維護、非時間敏感的任務應該在其餘線程異步執行。

    例如:網絡請求

    16.png

    • 使用GCD異步處理任務

      17.png

Instruments工具包含了很是豐富的數據,能夠自由選擇查看各機型、各指標類目的具體性能數據,一樣也正由於其展現的數據太過龐雜,可能讓開發者不清楚該從如何入手去進行優化。

Xcode 13中Instruments中新增了Regressions模塊,它會突出須要優先處理的性能問題,來簡化工做流。

二:Regressions

理解Instrument中的Regression

當一個APP相對與近期的版本,在性能或電量方面發生劣化,就稱爲迴歸(Regression)。

好比在上線一個新版本後,APP啓動時間增長。

1.png 最新版本的啓動時間,會與近期幾個版本的啓動時間的平均值進行比較,若是最新版本的啓動時間更長,就會標記爲迴歸。

2.png

Regression左側欄彙總了哪些指標被迴歸,以及相較上幾個版本劣化了多少。

  • Disk Writes

    磁盤和內存還有CPU同樣都是受限制的資源,不檢查磁盤寫入會損耗和傷害底層設備,同時還可能形成Hang(用戶操做超過250ms未響應記做一個Hang)和UI卡頓,甚至縮短電池壽命。

    • Insights

    Organzier新增了一個叫作Insights區域的區域,來提供一些性能優化建議

    4.png

  • File activities

    Instruments中的File activities也能夠用來debug儲存相關的問題。

    3.png

相關資料

System Trace in depth

What's new in MetricKit

Diagnose power and performance regressions in your app

Improving battery life and performance

Modernizing Grand Central Dispatch

Why is my app getting killed?

Triage TestFlight crashes with Xcode Organizer

Identify trends with the Power and Performace API

相關文章
相關標籤/搜索