Chrome DevTools性能图表最后一项的时间计算逻辑咨询
Chrome DevTools Profile自时间(Self-time)计算逻辑及自定义Profile问题解析
一、Self-time(自时间)的计算逻辑
在Chrome DevTools的采样型性能Profile中,Self-time指的是函数自身代码执行消耗的时间,完全不包含调用子函数的耗时,具体计算规则如下:
- 采样型Profile通过定期抓取CPU调用栈的顶端函数统计耗时,每个
sample对应一个栈顶函数的节点ID,timeDeltas是该采样区间的持续时长。 - 某个函数的Self-time = 所有以该函数为栈顶的
sample对应的timeDeltas时长总和。 - 对比Total-time:Total-time是该函数出现在调用栈中(无论是否为栈顶)的所有采样时长总和,包含子函数的执行耗时。
结合你提供的Profile数据,手动计算各函数的Self-time结果如下:
level-0:仅对应1个时长为0的采样,Self-time为0level-3-1:对应1个时长5000的采样,Self-time为5000level-2-2:对应1个时长4000的采样,Self-time为4000level-3-2:对应3个采样(时长1000+500+1000),Self-time为2500level-0-2:对应1个时长1000的采样,Self-time为1000level-1-2:对应1个时长500的采样,Self-time为500level-1、level-2-1没有作为栈顶的采样,Self-time为0
二、你的自定义Profile存在的问题
采样时长总和与时间范围不匹配
Profile中startTime为1,endTime为40000,理论总时长为39999,但你的timeDeltas总和仅为13000,这会让DevTools判定存在大量未采样的空白时间,可能导致分析结果异常。采样序列未反映合理的调用栈切换流程
按照你定义的节点父子关系,level-3-1的调用栈应该是ROOT→level-0→level-1→level-2-1→level-3-1,但你的采样直接从level-0跳到level-3-1,缺少中间层级的栈顶采样。虽然DevTools会通过节点父子关系回溯完整调用栈,但这种跳跃式采样不符合实际CPU调用栈的切换逻辑,可能导致Total-time的统计出现偏差。可选字段的合理性
hitCount字段全为0是允许的(采样型Profile可忽略调用次数统计),但如果需要更精准的分析,建议补充实际的函数调用次数。
内容的提问来源于stack exchange,提问作者egor vodopyanov
相关产品推荐
相关产品推荐

