检测和诊断卡顿问题 & 诊断电量和性能回归

一:卡顿

什么是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

相关文章
相关标签/搜索