試想這樣的場景:當用戶在你的APP中進行交互時,APP卻沒有及時的響應用戶的操做。git
這種體驗能夠被描述爲延時、慢、卡頓,在Apple開發中,咱們稱這種無響應的表現爲Hang。github
(舒適提示:本片內容來源自WWDC21:Understand and eliminate hangs from your app)和 Diagnose Power and Performance regressions in your app數據庫
想了解更多WWDC2021內容的小夥伴,能夠閱讀我如下文章,歡迎多多交流和指正緩存
APP終極性能生存指南markdown
用戶的交互均在主線程的Runloop發生。當用戶和APP交互,主線程會接受到這個事件,接下來處理這個事件,而後更新UI。app
若是處理事件耗費的很長時間,就從用戶交互到UI更新之間會發生延時(delay)。異步
主線程任務忙(Busy)ide
例如:過渡加載資源。當前頁面中只須要展現前4個圖片,可是卻一次性加載了全部的圖片。
例如:執行了與主線程不相關的任務。
再好比了使用次優的API。像繪製圖片圓角有兩種方法:
方法一:
方法二:
比較這兩種方法,法一是CPU密集型操做,會消耗大量內存。法二使用GPU進行繪製,更快更及時。
主線程阻塞(Blocked)
可能致使主線程阻塞的操做,例如:
同步請求網絡,並等待數據返回
文件IO等訪問系統資源的行爲
數據庫操做
鎖
使用Instruments,排查線下的問題
Time Profile
使用MetricKit,檢測線上的狀況
核心目標:減輕主線程的工做
優化必需在主線程中執行的任務
使用緩存
例如:由其餘線程負責保存和更新緩存,主線程只負責讀
使用Notification
在主線程中發送通知,其餘線程接受通知並異步處理數據
移除主線程沒必要要的任務
一般來講,爲UI提供關鍵信息的任務,應該在主線程執行。此外,全部的View和View Controller必須在主線程建立、修改和銷燬。
而計算任務能夠在其餘線程執行,而後在主線程同步UI。一些不重要的維護、非時間敏感的任務應該在其餘線程異步執行。
例如:網絡請求
使用GCD異步處理任務
Instruments工具包含了很是豐富的數據,能夠自由選擇查看各機型、各指標類目的具體性能數據,一樣也正由於其展現的數據太過龐雜,可能讓開發者不清楚該從如何入手去進行優化。
Xcode 13中Instruments中新增了Regressions模塊,它會突出須要優先處理的性能問題,來簡化工做流。
當一個APP相對與近期的版本,在性能或電量方面發生劣化,就稱爲迴歸(Regression)。
好比在上線一個新版本後,APP啓動時間增長。
最新版本的啓動時間,會與近期幾個版本的啓動時間的平均值進行比較,若是最新版本的啓動時間更長,就會標記爲迴歸。
Regression左側欄彙總了哪些指標被迴歸,以及相較上幾個版本劣化了多少。
Disk Writes
磁盤和內存還有CPU同樣都是受限制的資源,不檢查磁盤寫入會損耗和傷害底層設備,同時還可能形成Hang(用戶操做超過250ms未響應記做一個Hang)和UI卡頓,甚至縮短電池壽命。
Organzier新增了一個叫作Insights區域的區域,來提供一些性能優化建議
File activities
Instruments中的File activities也能夠用來debug儲存相關的問題。
Diagnose power and performance regressions in your app
Improving battery life and performance
Modernizing Grand Central Dispatch