Android 基于跟踪和基于采样的方法分析之间的差异及其对报告 cpu 次的影响
Difference between Android trace-based and sampling-based method profiling and its impact on reported cpu times
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 毫秒怎么办?我用它做了一些实验,但它无法捕获轻量级函数调用。关于它们的差异的任何想法或参考文档?
最后一个问题是相对比较哪个更准确?
据我所知两种采样方法都没有考虑开销。
Tracing 将正确计算每个函数调用。
采样 将以一定的频率对堆栈进行快照,这可以让您全面了解程序中实际花费的时间。
What if my function takes 0.2 milliseconds cpu time, and sampling
interval is 1 millisecond?
如果该函数运行速度很快并且很少被调用,采样可能不会捕获它。但是无论如何,您对很少调用的快速函数不感兴趣。
如果该函数经常被调用(比如每个间隔 50 次)并且没有被采样器捕获,这意味着它永远不会 运行 在采样点。这意味着它足够快。
通过重构程序的较大部分(采样器向您展示的部分)进行采样和优化。 JVM 上的微优化不会让你走得太远。
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 毫秒怎么办?我用它做了一些实验,但它无法捕获轻量级函数调用。关于它们的差异的任何想法或参考文档?
最后一个问题是相对比较哪个更准确?
据我所知两种采样方法都没有考虑开销。
Tracing 将正确计算每个函数调用。
采样 将以一定的频率对堆栈进行快照,这可以让您全面了解程序中实际花费的时间。
What if my function takes 0.2 milliseconds cpu time, and sampling interval is 1 millisecond?
如果该函数运行速度很快并且很少被调用,采样可能不会捕获它。但是无论如何,您对很少调用的快速函数不感兴趣。
如果该函数经常被调用(比如每个间隔 50 次)并且没有被采样器捕获,这意味着它永远不会 运行 在采样点。这意味着它足够快。
通过重构程序的较大部分(采样器向您展示的部分)进行采样和优化。 JVM 上的微优化不会让你走得太远。