微基准测试

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

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

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

其他类型的代码很难使用微基准测试库进行测量。因为基准测试在循环中运行,所以不经常运行或在多次调用时执行不同的代码可能不适合进行基准测试。

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

避免测量缓存

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

获取一致的基准测试结果

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

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

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

持续性能模式

Window.setSustainedPerformanceMode()是设备支持的一项功能,允许应用选择较低的最高 CPU 频率。在受支持的设备上运行时,微基准测试库会结合使用此 API 并启动其自身的活动,以防止热限制并稳定结果。

此功能默认情况下由 Android Gradle 插件设置的testInstrumentationRunner启用。如果您想使用自定义运行程序,您可以对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 存储库中的以下示例

其他资源

提供反馈

要报告问题或在使用基准测试时提交功能请求,请参阅公共问题跟踪器