Microbenchmark

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

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

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

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

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

避免测量缓存

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

不经常运行的代码

Android 运行时 (ART) 不太可能对仅在应用启动期间运行一次的代码进行 JIT 编译。因此,在紧密循环运行此代码时通过 Microbenchmark 对其进行基准测试,并不是测量此代码性能的有效方式。

如需对此类代码进行基准测试,我们建议使用 Jetpack Macrobenchmark,它支持测量更高级别的用户互动(例如应用启动和滚动性能)。

获得统一的基准测试

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

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

锁定时钟是获得稳定性能的最佳方式。它可以确保时钟频率绝不会过高而导致设备过热,也不会因基准测试不能充分利用 CPU 而导致频率过低。系统会在您使用 Gradle 运行 Microbenchmark 时自动采用这种方式,您也可以在 CI 中手动采用。虽然这是确保稳定性能的最佳方法,但大部分设备都不支持这样做,因为它需要已取得 root 权限的 Android 设备。

持续性能模式

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

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

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

自动暂停执行

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

示例

其他资源

提供反馈

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