Android Traceview中基于跟踪和基于采样的分析方法的区别是什么?我认为基于跟踪更准确,然而,它似乎会扭曲实际的cpu时间,特别是如果有其他调用函数。
例如,我想计算一个函数a,它有两个实现,如a -1和a -2。
- A-1多一个函数调用,如A-1-1。
- A-2也有更多的函数调用,如A-1-1,然而,A-1-1内部也有一个函数调用,如A-1-1-1。
现在我认为基于跟踪的分析将报告A-2的更高值,因为它需要跟踪一个额外的函数A-1-1-1,并且这个额外的cpu使用将在A-2的cpu时间中报告。我说的对吗?
那么问题就变成了,当基于跟踪的方法报告父函数的实际cpu时间时,它是否考虑到跟踪子方法所花费的cpu开销时间?
另一方面,基于抽样的方法的问题是它可能无法捕获非常轻量级的函数。如果我的函数占用0.2毫秒的cpu时间,采样间隔为1毫秒,该怎么办?我用它做了一些实验,它不能捕获轻量级函数调用。对它们的不同有什么想法或参考文献吗?
最后一个问题是相对比较哪个更准确?
据我所知抽样方法都没有考虑开销。
跟踪将正确计数每个函数调用。
采样将以一定的频率对堆栈进行快照,从而使您能够全面了解程序中实际花费的时间。
如果我的函数占用0.2毫秒的cpu时间,并且采样间隔是1毫秒?
-
如果该函数运行得很快并且很少被调用,那么采样可能无法捕获它。但是你不会对很少调用的快速函数感兴趣。
-
如果函数经常被调用(比如每个间隔50次)并且没有被采样器捕获,这意味着它在采样点从未运行过。这意味着它足够快了。
通过重构程序的较大部分(采样器显示的部分)进行采样和优化。JVM上的微优化不会让你走得太远。