Skip to content

TraceUtil 对于卡顿分析不够精确 #4

@CodingForMoney

Description

@CodingForMoney

对于卡顿分析,当前有一个这样的逻辑:

当一个帧栈信息与上一次的信息相差超过一个时长(目前设定为10ms), 我们认为主线程发生了休眠,则认为两个帧栈是两次调用,进行切割。

这样的逻辑的原因是:

避免 一些定时器或者监听在短时间能重复调用,而将两次调用统计成一次的问题。

但后续发现这样的分析也有问题,当主线程执行中遇到了锁(遇到锁导致的耗时,在instruments中如果没有设置Record Waiting Threads,则不会统计这部分消耗)或者IO操作时,可能超过这个耗时,而无法被精确统计。

所以之后要再研究并解决这个问题, 大致思路为 :

  1. 设置 Time ProfilerHigh FrequencyTrue, 这样每次检测时间就会由1ms变为0.1ms ,以确保检测的准确性,即尽量保证数据的准确性,试图抓到主线程Runloop中 beforeSleepafterSleep的附近的状态,以对其他边缘调用进行切割。
  2. 删除掉这个时长限制。

补充说明 :

  1. 主线程在Runloop中循环,基本上只会在两种状态中切换, runningblocked , 被阻塞的主要情况是 mach_msg_trap ,即等待新的消息; 而锁和IO操作也会使主线程阻塞。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions