“**自顶向下**”选项卡显示一个调用列表,其中展开方法或函数节点会显示其被调用方。图 2 显示了以下调用图表的自顶向下图。图中的每个箭头都从调用方指向被调用方。
如图 2 所示,在“**自顶向下**”选项卡中展开方法 A 的节点会显示其被调用方,即方法 B 和 D。然后,展开方法 D 的节点会显示其被调用方,例如方法 B 和 C。与“**火焰图**”选项卡类似,自顶向下的树会聚合共享相同调用栈的相同方法的跟踪信息。也就是说,“**火焰图**”选项卡提供了“**自顶向下**”选项卡的图形表示。
“**自顶向下**”选项卡提供以下信息来帮助描述在每个调用上花费的 CPU 时间(时间也表示为所选范围内线程总时间的百分比)
- **自身时间:**方法或函数调用花费在其自身代码上执行的时间,而不是在其被调用方上执行的时间,如图 1 中方法 D 所示。
- **子级时间:**方法或函数调用花费在其被调用方上执行的时间,而不是在其自身代码上执行的时间,如图 1 中方法 D 所示。
- **总时间:**方法的**自身时间**和**子级时间**之和。这表示应用花费在执行调用上的总时间,如图 1 中方法 D 所示。
“**自下而上**”选项卡显示调用列表,其中展开函数或方法的节点会显示其调用方。使用图 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。