微基准测试

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 和启动其自身的活动,来防止热节流并稳定结果。

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

该运行程序启动一个不透明的、全屏的活动,以确保基准测试在前景运行,并且没有任何其他应用程序进行绘制。

自动执行暂停

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

AOT 编译

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

示例

查看 GitHub 存储库中的以下示例

其他资源

提供反馈

要报告使用基准测试时遇到的问题或提交功能请求,请查看 公共问题跟踪器