自顶向下和自底向上图表

**自顶向下**选项卡显示调用列表,其中展开方法或函数节点将显示其被调用方。图 2 显示了以下调用图表的自顶向下图。图中的每个箭头都从调用方指向被调用方。

图 1. 一个示例调用图表,说明了方法 D 的自身、子级和总时间。

如图 2 所示,在**自顶向下**选项卡中展开方法 A 的节点会显示其被调用者,即方法 B 和 D。之后,展开方法 D 的节点会显示其被调用者,例如方法 B 和 C。与火焰图选项卡类似,自顶向下的树会聚合共享相同调用栈的相同方法的跟踪信息。也就是说,**火焰图**选项卡提供了**自顶向下**选项卡的图形表示。

**自顶向下**选项卡提供以下信息,以帮助描述每个调用上花费的 CPU 时间(时间也表示为线程在选定范围内总时间的百分比)

  • 自身:方法或函数调用花费在执行自身代码上的时间,而不是其被调用者的代码,如图 1 中方法 D 所示。
  • 子项:方法或函数调用花费在执行其被调用者上的时间,而不是其自身代码,如图 1 中方法 D 所示。
  • 总计:方法的**自身**和**子项**时间的总和。这表示应用程序花费在执行调用上的总时间,如图 1 中方法 D 所示。

图 2. 自顶向下的树。

图 3. 图 5 中方法 C 的自底向上树。

**自底向上**选项卡显示一个调用列表,展开函数或方法的节点会显示其调用者。使用图 2 中显示的示例跟踪,图 3 提供了方法 C 的自底向上树。在自底向上树中打开方法 C 的节点会显示其每个唯一的调用者,即方法 B 和 D。请注意,尽管 B 调用 C 两次,但在自底向上树中展开方法 C 的节点时,B 只出现一次。之后,展开 B 的节点会显示其调用者,即方法 A 和 D。

**自底向上**选项卡可用于根据消耗最多(或最少)CPU 时间的方法或函数进行排序。您可以检查每个节点以确定哪些调用者花费最多的 CPU 时间来调用这些方法或函数。与自顶向下的树相比,自底向上树中每个方法或函数的计时信息都是相对于每棵树顶部的第一个方法(顶层节点)而言的。CPU 时间也表示为该记录期间线程总时间的百分比。下表有助于解释如何解释顶层节点及其调用者(子节点)的计时信息。

自身 子项 总计
自底向上树顶部的第一个方法或函数(顶层节点) 表示方法或函数花费在其自身代码上执行的时间,而不是其被调用者的代码。与自顶向下的树相比,此计时信息表示在记录期间对该方法或函数的所有调用的总和。 表示方法或函数花费在其被调用者上执行的时间,而不是其自身代码。与自顶向下的树相比,此计时信息表示在记录期间对该方法或函数的被调用者的所有调用的总和。 自身时间和子项时间的总和。
调用者(子节点) 表示被调用者在被调用者调用时自身的总时间。例如,在图 6 中的自底向上树中,方法 B 的自身时间将等于方法 C 在被 B 调用时每次执行的自身时间的总和。 表示被调用者在被调用者调用时子项的总时间。例如,在图 6 中的自底向上树中,方法 B 的子项时间将等于方法 C 在被 B 调用时每次执行的子项时间的总和。 自身时间和子项时间的总和。

注意:对于给定的记录,当分析器达到文件大小限制时,Android Studio 会停止收集新数据(但是,这不会停止记录)。在执行已插入跟踪时,这种情况通常会更快发生,因为与采样跟踪相比,这种类型的跟踪在更短的时间内会收集更多数据。如果您将检查时间延长到达到限制后发生的记录期间,则跟踪窗格中的计时数据不会更改(因为没有新的数据可用)。此外,当您仅选择记录中没有数据的那一部分时,跟踪窗格会显示NaN作为计时信息。