-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Description
对于卡顿分析,当前有一个这样的逻辑:
当一个帧栈信息与上一次的信息相差超过一个时长(目前设定为10ms), 我们认为主线程发生了休眠,则认为两个帧栈是两次调用,进行切割。
这样的逻辑的原因是:
避免 一些定时器或者监听在短时间能重复调用,而将两次调用统计成一次的问题。
但后续发现这样的分析也有问题,当主线程执行中遇到了锁(遇到锁导致的耗时,在instruments中如果没有设置Record Waiting Threads,则不会统计这部分消耗)或者IO操作时,可能超过这个耗时,而无法被精确统计。
所以之后要再研究并解决这个问题, 大致思路为 :
- 设置
Time Profiler的High Frequency为True, 这样每次检测时间就会由1ms变为0.1ms,以确保检测的准确性,即尽量保证数据的准确性,试图抓到主线程Runloop中beforeSleep和afterSleep的附近的状态,以对其他边缘调用进行切割。 - 删除掉这个时长限制。
补充说明 :
- 主线程在Runloop中循环,基本上只会在两种状态中切换,
running和blocked, 被阻塞的主要情况是mach_msg_trap,即等待新的消息; 而锁和IO操作也会使主线程阻塞。
Metadata
Metadata
Assignees
Labels
No labels