Microbenchmark

您可以利用 Jetpack Microbenchmark 库在 Android Studio 内对 Android 原生代码(Kotlin 或 Java)进行基准测试。该库会处理预热过程,测量代码性能和分配计数,并将基准测试结果输出到 Android Studio 控制台,还会生成一个包含更多测试结果详情的 JSON 文件

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

Microbenchmark 最适用于应用中频繁运行的 CPU 工作(也称为热代码路径),典型例子包括一次显示一项的 RecyclerView 滚动、数据转换或处理以及反复使用的其他代码段。

其他类型的代码较难以通过 Microbenchmark 库进行测量。由于基准测试循环运行,因此任何不经常运行或在多次调用时以不同方式执行的代码都可能不适合进行基准测试。

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

避免测量缓存

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

获得统一的基准测试

移动设备上的时钟会动态地从高频状态(高性能)变为低频状态(以节省电量,或者在设备变热时)。这些变化的时钟可能会使您的基准数据大幅变化,因此该库提供了解决此问题的方法。

锁定时钟(需要已取得 root 权限的设备)

锁定时钟是获得稳定性能的最佳方式。它有助于确保时钟频率绝不会过高而导致设备过热,也不会因基准测试不能充分利用 CPU 而导致频率过低。可以通过 Gradle 任务 (gradlew lockClocks) 应用该工具,也可以在持续集成环境中手动应用。虽然这是确保稳定性能的最佳方法,但大部分设备都不支持这样做,因为它需要使用已启用 root 权限的 Android 设备。

持续性能模式

设备支持的 Window.setSustainedPerformanceMode() 功能可让应用选择降低 CPU 频率上限。在受支持的设备上运行时,Microbenchmark 库会使用此 API 的组合并启动自己的 activity,以防止出现温控降频并获得稳定的结果。

默认情况下,Android Gradle 插件设置的 testInstrumentationRunner 会启用此功能。如需使用自定义运行程序,可以创建 AndroidBenchmarkRunner 的子类并将其用作 testInstrumentationRunner

该运行程序会启动一个不透明的全屏 activity,以确保基准测试在前台运行,并避免任何其他应用参与绘制。

自动暂停执行

如果您不使用时钟锁定或持续性能模式,该库会执行自动温控降频检测。启用后,内部基准将会定期运行,以确定设备温度何时达到了足以导致 CPU 性能降低的程度。当检测到 CPU 性能降低时,该库会暂停执行以便设备冷却,然后重试当前的基准测试。

AOT 编译

复杂的微基准数据可能需要很长时间才能稳定下来, 防抖效果很难检测到由于衡量结果一致, 迭代速度是重中之重,androidx.benchmark 插件全面 会默认编译您的 Microbenchmark APK,类似于 Macrobenchmark 中的 CompilationMode.Full。此行为需要使用基准测试 1.3.0-beta01+ 和 Android Gradle 插件 8.4.0+。您可以选择停用此功能 设置 androidx.benchmark.forceaotcompilation=false gradle.properties 文件。

示例

请参阅 GitHub 代码库中的以下示例:

其他资源

提供反馈

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