微基准测试

Jetpack Microbenchmark 库可让您在 Android Studio 中对 Android 原生代码(Kotlin 或 Java)进行基准测试。该库负责预热、测量代码性能和分配计数,并将基准测试结果输出到Android Studio 控制台和包含更多详细信息的 JSON 文件

我们建议您在编写基准测试之前对代码进行性能分析。这有助于您找到值得优化的开销大的操作。它还可以通过显示操作运行时发生的情况(例如在低优先级线程上运行、由于磁盘访问而休眠或意外调用开销大的函数,如位图解码)来显示操作缓慢的原因。

微基准测试对于在您的应用中多次运行的 CPU 工作(也称为热代码路径)最有用。很好的示例包括一次显示一个项目的 RecyclerView 滚动、数据转换或处理以及其他重复使用的代码段。

其他类型的代码使用 Microbenchmark 库测量起来更困难。由于基准测试在循环中运行,因此任何不经常运行或多次调用时表现不同的代码可能都不适合进行基准测试。

要了解如何在持续集成 (CI) 环境中使用该库,请参阅在持续集成中运行基准测试

避免测量缓存

尽量避免只测量缓存。例如,自定义视图的布局基准测试可能只测量布局缓存的性能。为避免这种情况,您可以在每个循环中传递不同的布局参数。在其他情况下,例如测量文件系统性能时,这可能很困难,因为操作系统在循环中会缓存文件系统。

获取一致的基准

移动设备上的时钟会动态地从高性能状态更改为低性能状态,以节省电量或在设备发热时。这些变化的时钟会使您的基准测试数字差异很大,因此该库提供了处理此问题的方法。

锁定时钟(需要已 root 的设备)

锁定时钟是获得稳定性能的最佳方式。它有助于确保时钟永远不会高到足以使设备发热,或者在基准测试未充分利用 CPU 时不会过低。它可以通过 Gradle 任务 (gradlew lockClocks) 应用,或者在 CI 中手动应用。虽然这是帮助确保稳定性能的最佳方式,但由于需要已 root 的 Android 驱动设备,因此在大多数设备上不支持。

持续性能模式

Window.setSustainedPerformanceMode() 是设备支持的一项功能,允许应用选择较低的最大 CPU 频率。当在受支持的设备上运行时,Microbenchmark 库结合使用此 API 和启动其自己的 activity,以防止热节流并稳定结果。

此功能默认由 Android Gradle 插件设置的 testInstrumentationRunner 启用。如果您想使用自定义运行器,您可以子类化 AndroidBenchmarkRunner 并将其用作您的 testInstrumentationRunner

运行器会启动一个不透明的全屏 activity,以确保基准测试在前台运行,且没有任何其他应用进行绘制。

自动执行暂停

如果您不使用时钟锁定或持续性能模式,该库会执行自动热节流检测。启用后,内部基准测试会定期运行,以确定设备温度何时高到足以降低 CPU 性能。当它检测到 CPU 性能下降时,该库会暂停执行,让设备冷却,然后重试当前的基准测试。

AOT 编译

复杂的微基准测试可能需要很长时间才能稳定,并且使稳定性很难检测。由于一致的测量和快速的迭代速度是重中之重,androidx.benchmark 插件默认会完全编译您的微基准测试 APK,类似于 Macrobenchmarks 中的 CompilationMode.Full。此行为需要 Benchmark 1.3.0-beta01+ 和 Android Gradle Plugin 8.4.0+。您可以通过在您的 gradle.properties 文件中设置 androidx.benchmark.forceaotcompilation=false 来选择禁用此行为。

示例

请参阅 GitHub 仓库中的以下示例

其他资源

提供反馈

如需报告问题或提交在使用基准测试时遇到的功能请求,请参阅公开问题跟踪器