对您的应用进行基准测试

基准测试是测试应用性能的一种方法。您可以定期运行基准测试,以帮助分析和调试性能问题,并确保近期的更改未引起任何性能倒退。

Android 提供了两种进行基准测试的库和方法,它们对于分析和测试应用在不同情况下的性能表现非常有用:Benchmark 和 Macrobenchmark。

Benchmark 与 Macrobenchmark

借助 Jetpack Benchmark 库,您可以直接在一个循环中对应用代码进行基准测试。该库旨在衡量 CPU 工作情况,衡量结果将用于评估最佳性能(JIT 已预热,磁盘访问已缓存),使用内部循环或特定热函数时就可能获得这种最佳性能。

基准测试会直接调用受测代码,如下所示:

@get:Rule
val benchmarkRule = BenchmarkRule()

@Test
fun myBenchmarkTest() {
    benchmarkRule.measureRepeated {
        // code or function call that you want to benchmark
    }
}

基准库只报告应用的相关信息,而非整个系统的相关信息。因此,基准测试最适合用来分析应用在特定情况下的性能,而不是分析系统的整体性能问题。例如,应用启动涉及在应用外部的操作以及在执行应用代码之前的操作,因此在研究启动性能问题时,查看这些信息会非常有用。微基准测试对于解决此类问题没有帮助。

Macrobenchmark 可衡量更大规模的最终用户互动,例如启动、滚动和动画。与基准库不同,Macrobenchmark 可在外部从您提供的测试应用注入事件并监控结果。

通过 Macrobenchmark 可以直接控制受测性能环境。例如,除了“warm”和“hot”启动选项外,您还可以指定测试首次安装后的冷启动性能,如改写自 Macrobenchmark 示例的下例所示:

@Test
fun startup() = benchmarkRule.measureStartup(
    packageName = "mypackage.myapp",
    metrics = listOf(StartupTimingMetric()),
    iterations = 5,
    startupMode = StartupMode.COLD
) {
    pressHome()
    startActivityAndWait(Intent().apply {
        action = "mypackage.myapp.myaction"
    })
}

Macrobenchmark 的测试结果中包含轨迹文件,这些文件有助于您找出需要分析和调试的性能问题。您可以在 Android Studio 中查看这些文件。

Benchmark Macrobenchmark
衡量各个函数 衡量高级层入口点(例如,activity 启动或列表滚动)
对 CPU 工作情况进行进程内测试 对整个应用进行进程外测试
迭代速度较快(通常不到 10 秒) 迭代速度中等(通常会超过 1 分钟)
可选的方法采样和跟踪 结果包含性能分析轨迹
最低 API 14 最低 API 23