试想这样的场景:当用户在你的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