Top Down 标签页显示一个调用列表,在该列表中展开方法或函数节点会显示它的被调用方。图 2 显示了以下调用图表的自上而下图。图中的每个箭头都从调用方指向被调用方。
图 1. 一个调用图表示例,展示了方法 D 的 Self 时间、Children 时间和 Total 时间。
如图 2 所示,在 Top Down 标签页中展开方法 A 的节点会显示它的被调用方,即方法 B 和 D。在此之后,展开方法 D 的节点会显示它的被调用方,例如方法 B 和 C。与 Flame chart 标签页类似,“Top Down”树也汇总了具有相同调用堆栈的完全相同的方法的轨迹信息。也就是说,Flame chart 标签页提供了 Top Down 标签页的图形表示方式。
Top Down 标签页提供以下信息来帮助说明在每个调用上所花的 CPU 时间(时间也可表示为在选定范围内占线程总时间的百分比):
- Self:方法或函数调用在执行自己的代码(而非被调用方的代码)上所花的时间,如图 1 中的方法 D 所示。
- Children:方法或函数调用在执行它的被调用方(而非自己的代码)上所花的时间,如图 1 中的方法 D 所示。
- Total:方法的 Self 时间和 Children 时间的总和。这表示应用在执行调用时所用的总时间,如图 1 中的方法 D 所示。

图 2. 一个“Top Down”树。

图 3. 图 5 中方法 C 的 Bottom Up 树。
Bottom Up 标签页显示一个调用列表,在该列表中展开函数或方法的节点会显示它的调用方。沿用图 2 中所示的轨迹示例,图 3 提供了方法 C 的 Bottom Up 树。在该 Bottom Up 树中打开方法 C 的节点会显示它独有的两个调用方,即方法 B 和 D。请注意,尽管 B 调用 C 两次,但在“Bottom Up”树中展开方法 C 的节点时,B 仅显示一次。在此之后,展开 B 的节点会显示它的调用方,即方法 A 和 D。
Bottom Up 标签页用于按照占用的 CPU 时间由多到少(或由少到多)的顺序对方法或函数排序。您可以检查每个节点以确定哪些调用方在调用这些方法或函数上所花的 CPU 时间最多。与“Top Down”树相比,“Bottom Up”树中每个方法或函数的时间信息参照的是每个树顶部的方法(顶部节点)。CPU 时间也可表示为在该记录期间占线程总时间的百分比。下表说明了如何解读顶部节点及其调用方(子节点)的时间信息。
Self | Children | Total | |
---|---|---|---|
“Bottom Up”树顶部的方法或函数(顶部节点) | 表示方法或函数在执行自己的代码(而非被调用方的代码)上所花的总时间。与“Top Down”树相比,此时间信息表示在记录的持续时间内对此方法或函数的所有调用时间的总和。 | 表示方法或函数在执行它的被调用方(而非自己的代码)上所花的总时间。与“Top Down”树相比,此时间信息表示在记录的持续时间内对此方法或函数的被调用方的所有调用时间的总和。 | Self 时间和 Children 时间的总和。 |
调用方(子节点) | 表示被调用方在由调用方调用时的总 Self 时间。以图 6 中的 Bottom Up 树为例,方法 B 的 Self 时间将等于每次执行由方法 B 调用的方法 C 所用的 Self 时间的总和。 | 表示被调用方在由调用方调用时的总 Children 时间。以图 6 中的 Bottom Up 树为例,方法 B 的 Children 时间将等于每次执行由方法 B 调用的方法 C 所用的 Children 时间的总和。 | Self 时间和 Children 时间的总和。 |
注意:对于给定的记录,当性能分析器达到文件大小限制时,Android Studio 会停止收集新数据(但不会停止记录)。在执行检测轨迹时,这种情况通常发生得更快,因为与采样轨迹相比,此类轨迹会在更短的时间内收集更多的数据。如果您将检查时间范围延长至达到限制后的记录时段,则轨迹窗格中的时间数据不会发生变化(因为没有新数据可用)。此外,当您仅选择没有可用数据的那部分记录时,对于时间信息,轨迹窗格将显示 NaN。