分析微基准

默认情况下,微基准会提供有关已执行代码的计时和分配信息。如果您想调查为什么测量代码运行缓慢,请检查方法跟踪(在 支持的操作系统版本上默认捕获)或选择其他性能分析配置。

要选择分析器配置,请添加检测运行器参数 androidx.benchmark.profiling.mode,并将其设置为 MethodTracing(默认)、StackSamplingNone 参数之一,如以下代码段所示。

有关这些选项的更多信息,请参阅记录 Java/Kotlin 方法MethodTracing 等同于该文档中定义的跟踪,而 StackSampling 等同于采样。

Groovy

android {
    defaultConfig {
        // must be one of: 'None', 'StackSampling', or 'MethodTracing'
        testInstrumentationRunnerArguments["androidx.benchmark.profiling.mode"]= 'StackSampling'
    }
}

Kotlin

android {
    defaultConfig {
        // must be one of: 'None', 'StackSampling', or 'MethodTracing'
        testInstrumentationRunnerArguments["androidx.benchmark.profiling.mode"] = "StackSampling"
    }
}

对基准进行性能分析时,输出的 .trace 文件会复制到主机上的目录中,与 JSON 结果放在一起。要在 Android Studio 中检查性能分析结果,请在微基准结果中选择“方法跟踪”或“堆栈采样跟踪”链接。

方法跟踪

方法跟踪在您尝试优化代码时非常有用,因为它可以帮助您识别运行时间比其他方法长的方法。然后,您可以专注于优化对性能影响最大的方法。

性能分析在代码测量之后按顺序进行,因此您的测试会输出准确的计时和性能分析结果。

方法跟踪默认处于开启状态。

注意:在某些 Android 操作系统和 ART 版本上,方法跟踪默认处于关闭状态。在这种情况下,Android Studio 会输出警告。

堆栈采样

采样跟踪也可以帮助识别开销大的方法,而不会产生方法跟踪的性能开销。但是,如果您的应用在捕获调用堆栈后进入某个方法,并且在该方法在下次捕获之前退出,则不会记录该方法调用。要正确跟踪生命周期短的方法,请使用方法跟踪而非采样跟踪。

通过堆栈采样,基准会在预热完成后对调用堆栈进行采样。您可以使用检测参数控制采样行为,例如采样频率采样持续时间

在 Android 10 (API 29) 及更高版本上,堆栈采样使用 Simpleperf 对应用调用堆栈进行采样,包括 C++ 代码。在 Android 9 (API 28) 及更低版本上,它使用 Debug.startMethodTracingSampling 捕获堆栈样本。

您可以通过添加其他检测参数来配置此性能分析模式

  • androidx.benchmark.profiling.sampleFrequency

    • 每秒要捕获的堆栈样本数量。
    • 参数类型:整数
    • 默认为每秒 1000 个样本。
  • androidx.benchmark.profiling.sampleDurationSeconds

    • 基准运行持续时间。
    • 参数类型:整数
    • 默认为 5 秒。
  • androidx.benchmark.profiling.skipWhenDurationRisksAnr

    • 在可能导致 ANR 时跳过方法跟踪。您应该在 CI 运行中保持此设置启用,因为 ANR 可能会在长时间的 CI 运行期间导致问题。
    • 参数类型:布尔值
    • 默认为 true

此参数不捕获性能分析文件。计时和分配信息仍将测量。