对 Microbenchmark 进行性能分析

默认情况下,Microbenchmark 可为您提供有关已执行代码的时间和分配情况的信息。如果您想调查所测量的代码运行缓慢的原因,请检查方法轨迹(默认情况下在受支持的操作系统版本上捕获),或选择其他性能分析配置。

如需选择性能分析器配置,请添加插桩测试运行程序参数 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 中检查性能分析结果,请在微基准测试结果中选择 Method TraceStack Sampling Trace 链接。

MethodTracing

当您尝试优化代码时,方法轨迹非常有用,因为它可帮助您找出运行时间比其他方法更长的方法。这样,您就可以专注于优化对性能影响最大的方法。

代码衡量后会依序进行性能分析,因此测试会输出准确的时间和性能分析结果。

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

注意:在某些 Android OS 和 ART 版本中,方法跟踪功能默认处于关闭状态。在这些情况下,Android Studio 会输出警告。

StackSampling

此外,样本轨迹还有助于找出开销高昂的方法,而不会产生方法轨迹的性能开销。但是,如果您的应用在捕获调用堆栈后进入一个方法,并且该方法在下次捕获前退出,则系统不会记录该方法调用。为了正确跟踪生命周期较短的方法,请使用方法轨迹而不是样本轨迹。

对于堆栈采样,基准测试会在预热完成后对调用堆栈进行采样。您可以使用插桩参数控制采样行为,例如采样频率采样时长

在 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

此参数不会捕获性能分析文件,但仍然会测量有关时间和分配情况的信息。