简介
Hang
APP一段无呼应的阶段,因为主线程忙于其他使命或许等候其他线程或许体系资源,导致视图内容更新推迟至少250ms
Main Loop
用户与设备进行交互,Runloop接纳事情,处理事情,有需求的状况下更新UI,这些都产生在主线程runloop的一圈中
处理时刻比较久的状况下,用户输入和UI更新之间就会产生推迟。更差的状况下,当hang产生的时分,事情被堆积起来而主线程无法处理
hang的影响在不同的场景下造成的影响也不同。一般超越1秒的推迟总是会被看成是hang,不过更短时刻的推迟也会。比如在滑动过程中,0.5秒的推迟用户体验就很不好了,但是转场中就不会这么明显
Hang的原因
- 主线程本身繁忙
- 一个单次长使命
- 多个短使命
- 主线程被其他线程或许体系资源Block住
主线程繁忙
履行多余的工作
履行不相关的工作
主线程阻塞
I/O
主线程读取需求等候其他线程写入完结
Synchronization
主线程等候其他线程开释锁
获取不常变的数据
在存储器的层级上,在部分体系API的获取上,存在较大的速度差,这种状况下需求缓存数据,不能在主线程中重复获取这类不会经常变化的数据
获取联系人
拜访体系资源
监控和确诊
- 开发阶段能够使用Performance Checker,Instruments
- Beta阶段能够敞开设备上Hang检测,或许使用MetricKit
- 发布后能够在Xcode Reports Organizer对Hang进行监控
开发阶段
System Trace
红线标识了体系调用,紫色图形标识了虚拟内存缺页,水平蓝色区域标识主线程正在繁忙。在Profile中找到对这4.7s阶段的主线程仓库聚合
Time Profiler
iOS 16, Xcode 14
经过持续显现使用的调用栈,标识了使用当时正在履行的内容
Thread Performance Checker
iOS 16, Xcode 14
检测优先级反转和主线程履行非UI使命
Beta测试阶段
On-device hang detection
iOS 16, Xcode 14
在设置 > 开发者 > Hang检测中,阈值有250ms,500ms,1000ms,2000ms几个选项。供给了实时的Hang告诉,支持在在开发者签名的包和TestFlight包中确诊
对于Hang的检测是在后台以最低优先级的使命运转,用于最低极限的最小化对功能的负载影响,如果体系处于繁忙状况的话,则履行得会更久一些。有新的确诊可用的时分,告诉会议示出来
发布阶段
MetricKit
这个库能够收集来自单一用户在Beta或许线上发布的APP中非聚合的 hang率目标和确诊陈述
此处发现在获取联系人的函数导致的hang的问题
Xcode Organizer
iOS 16, Xcode 14
在Organizer东西中能够看到依照app version,日期,iOS体系版本分布的图表化信息,其间包含率Hangs的相关目标
选择Hangs选项
其间也包含了关于Hang的仓库信息详情,需求上传对应的符号表用户符号化仓库信息
能够经过App Store Connect REST APIs来拜访Xcode Organizer中的数据内容,这样能够更好的跟开发者自建的体系集成或许添加额外的分析
Xcode 13.2开端Xcode Organizer中能够接纳到关于监控功能目标的告诉,主张打开告诉开关,能够更好的接纳告诉用于预警例如Hang目标忽然添加的状况
消除Hang
削减主线程工作
Caches
因为不同层级存储器拜访速度不同的问题,由其主线程或许他线程拜访数据之后,缓存到高速拜访存储器,之后主线程拜访能够节省大量的时刻
Observers
观察者这种方式能够让主线程只关心数据或状况的变化,而不必进行昂贵开支和按需核算
移除主线程工作
Asynchronous API
许多非要害的使命能够交给低优先级的线程完结,即使需求多花一些时刻,主线程能够专注于其他要害使命
GCD
异步使命并行行列能够很好的开释主线程的资源,履行完结之后能够回主行列回主线程履行UI更新等操作
引用
Track down hangs with Xcode and on-device detection
Understand and eliminate hangs from your app
Apple Document Improving app responsiveness
Analyze hangs with Instruments
引申
WWDC16 – System Trace in depth
WWDC17 – Modernizing Grand Central Dispatch Usage
WWDC19 – Improving battery life and performance
WWDC20 – Identify trends with the Power and Performance API
WWDC21 – Diagnose Power and Performance regressions in your app