5

Android Traceview 中基于跟踪和基于采样的分析方法有什么区别?我认为基于跟踪更准确,但是,它似乎会扭曲实际的 cpu 时间,特别是如果有其他调用函数。

例如,我想评估一个函数 A,它有两个实现,例如 A-1 和 A-2。

  1. A-1 多了一个函数调用,比如 A-1-1。
  2. A-2也有更多的函数调用,比如A-1-1,但是A-1-1里面也有一个函数调用,比如A-1-1-1。

现在我认为基于跟踪的分析将为 A-2 报告更高的值,因为它需要跟踪一个额外的函数 A-1-1-1,并且这个额外的 cpu 使用情况将在 A-2 的 cpu 时间中报告。我对吗 ?

那么问题就来了,基于trace的方法在报告父函数的实际cpu时间时,是否考虑了跟踪子方法所花费的cpu开销时间呢?

另一方面,基于采样的方法的问题是它可能无法捕获非常轻量级的函数。如果我的函数占用 0.2 毫秒 cpu 时间,采样间隔为 1 毫秒怎么办?我用它做了一些实验,它无法捕获轻量级函数调用。关于它们的差异有什么想法或参考文档吗?

最后一个问题是相对比较哪个更准确?

4

1 回答 1

8

据我所知,这两种采样方法都没有考虑开销。

跟踪将正确计算每个函数调用。

采样将以一定的频率对堆栈进行快照,从而为您提供程序实际花费时间的总体情况。

如果我的函数占用 0.2 毫秒 cpu 时间,采样间隔为 1 毫秒怎么办?

  • 如果该函数运行得很快并且很少被调用,那么采样可能不会捕获它。但是无论如何,您对很少调用的快速函数不感兴趣。

  • 如果函数经常被调用(比如每个间隔 50 次)并且没有被采样器捕获,这意味着它永远不会在采样点运行。这意味着它足够快。

通过重构程序的较大部分(采样器向您显示的部分)进行采样和优化。JVM 上的微优化不会让您走得太远。

于 2016-12-29T15:31:28.370 回答