Google 致力于为黑人社区推动种族平等。查看具体举措

Benchmark

使用 Benchmark 库,您可以轻松地从 Android Studio 中对 Kotlin 或 Java 代码进行基准化分析。该库会处理预热,衡量代码性能,并将基准化分析结果输出到 Android Studio 控制台。

如需了解如何在应用或库中使用 Benchmark 库,请参阅对应用代码进行基准化分析

最近更新时间 当前稳定版 下一候选版本 Beta 版 Alpha 版
2020 年 6 月 10 日 1.0.0 - - 1.1.0-alpha01

声明依赖项

如需添加 Benchmark 的依赖项,您必须将 Google Maven 代码库添加到项目中。有关详情,请阅读 Google 的 Maven 代码库

在应用或模块的 build.gradle 文件中添加所需工件的依赖项:

    dependencies {
      androidTestImplementation
        "androidx.benchmark:benchmark-junit4:1.0.0"
    }

    android {
      ...
      defaultConfig {
        ...
        testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner"
      }
    }
    

Benchmark 库还提供了可与基准模块搭配使用的 Gradle 插件。此插件可设置模块的默认构建配置,设置将基准输出复制到主机,并提供 ./gradlew lockClocks 任务

要使用该插件,请在顶级 build.gradle 文件中添加以下 classpath

    buildscript {
        repositories {
            google()
        }
        dependencies {
            classpath "androidx.benchmark:benchmark-gradle-plugin:1.0.0"
        }
    }
    

然后,将该插件应用到基准模块的 build.gradle 文件

apply plugin: "androidx.benchmark"

反馈

您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对此库的改进有自己的见解,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。

创建新问题

如需了解详情,请参阅问题跟踪器文档

版本 1.1.0

版本 1.1.0-alpha01

2020 年 6 月 10 日

发布了 androidx.benchmark:benchmark-common:1.1.0-alpha01androidx.benchmark:benchmark-gradle-plugin:1.1.0-alpha01androidx.benchmark:benchmark-junit4:1.1.0-alpha01版本 1.1.0-alpha01 中包含这些提交内容

1.1 的新功能

  • 分配指标 - 基准现在会在预热和计时后运行一个额外的阶段,以捕获分配计数。分配可能会导致旧版平台出现性能问题(O 中的 140ns 变为 M 中的 8ns - 在 Nexus5X 上测量,时钟处于锁定状态)。该指标显示以下位置:在 Android Studio 控制台输出以及
  • 性能剖析支持 - 您现在可以捕获基准运行的性能剖析数据,以检查代码运行缓慢的原因。Benchmark 支持捕获方法跟踪记录或 ART 中的方法采样。您可以使用 Android Studio 中的性能剖析器(依次选择“File > Open”)来检查这些文件。
  • Benchmark Gradle 插件现在提供默认设置,以便简化设置过程:
    • testBuildType 默认设置为发布,以避免使用内置代码覆盖率的依赖项。发布 buildType 也会配置为默认 buildType,以便让 Android Studio 能够在首次打开某个项目时自动选择正确的构建变体。(b/138808399)
    • signingConfig.debug 用作默认的签名配置 (b/153583269)

** 问题修复 **

  • 显著降低了预热过渡开销,其中每个基准的首次测量值都因人为原因而高于其他测量值。该问题在非常小的基准(1 毫秒或更短)中更加明显。(b/142058671)
  • 修复了从命令行运行时针对每个基准输出的 InstrumentationResultParser 错误。(I64988b/154248456

已知问题

  • 命令行、Benchmark 的 Gradle 调用不直接输出结果。若要解决该问题,您可以查看 Studio,也可以解析 JSON 输出文件以获取结果。
  • Benchmark 报告无法从已安装应用 ID 以“android”或“download”(不区分大小写)结尾的应用的设备中提取报告。遇到该问题的用户应将 Android Gradle 插件升级到 4.2-alpha01 或更高版本。

版本 1.0.0

Benchmark 版本 1.0.0

2019 年 11 月 20 日

发布了 androidx.benchmark:benchmark-common:1.0.0androidx.benchmark:benchmark-gradle-plugin:1.0.0androidx.benchmark:benchmark-junit4:1.0.0,这些版本与 1.0.0-rc01 相比没有变化。版本 1.0.0 中包含这些提交内容

1.0.0 的主要功能

使用 Benchmark 库,您可为应用代码编写性能基准化测试并快速获得分析结果。

它可以防止出现编译和运行时配置问题并稳定设备性能,以确保衡量值的准确性和一致性。直接在 Android Studio 中在持续集成中运行基准化分析,以观察代码性能随时间的变化情况,并防止出现回归。

主要功能包括:

  • 时钟稳定
  • 自动设置线程优先级
  • 支持界面性能测试,例如在 RecyclerView 示例
  • JIT 感知预热和循环
  • 用于后期处理的 JSON 基准输出

版本 1.0.0-rc01

2019 年 10 月 23 日

发布了 androidx.benchmark:benchmark-common:1.0.0-rc01androidx.benchmark:benchmark-gradle-plugin:1.0.0-rc01androidx.benchmark:benchmark-junit4:1.0.0-rc01版本 1.0.0-rc01 中包含这些提交内容

新功能

  • 向基准添加了 systrace 跟踪记录

问题修复

  • 修复了由于优先级设置导致 JIT 无法在预热前结束的指标不稳定问题 (b/140773023)
  • 统一了 Android Gradle 插件 3.5 和 3.6 的 JSON 输出目录

版本 1.0.0-beta01

2019 年 10 月 9 日

发布了 androidx.benchmark:benchmark-common:1.0.0-beta01androidx.benchmark:benchmark-gradle-plugin:1.0.0-beta01androidx.benchmark:benchmark-junit4:1.0.0-beta01版本 1.0.0-beta01 中包含这些提交内容

新功能

  • 在每次预热之前运行垃圾回收,以减少从一个基准泄漏到下一个基准的内存压力 (b/140895105)

问题修复

  • 添加了 androidx.annotation:android-experimental-lint 依赖项,以便在未使用实验性 API 时,Java 代码将正确生成 lint 错误,类似于 Kotlin 实验性注释针对 Kotlin 调用方提供的内容。
  • 现在可正确检测 Android Gradle 插件 3.6 中输出的 additionalTestOutputDir 插桩参数的使用情况,了解 AGP 何时处理数据副本。
  • 修复了 JSON 中未检测到的时钟频率,以正确打印 -1 (b/141945670)。

版本 1.0.0-alpha06

2019 年 9 月 18 日

发布了 androidx.benchmark:benchmark-common:1.0.0-alpha06androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha06androidx.benchmark:benchmark-junit4:1.0.0-alpha06版本 1.0.0-alpha06 中包含这些提交内容

新功能

  • 添加了检查以确定错误使用旧软件包的测试运行程序,该程序现在提供更有用的错误消息

API 变更

  • 实验性注释 ExperimentalAnnotationReport 现已正确公开。现在,使用实验性 BenchmarkState#report API 时需要此注释

版本 1.0.0-alpha05

2019 年 9 月 5 日

发布了 androidx.benchmark:benchmark-common:1.0.0-alpha05androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha05androidx.benchmark:benchmark-junit4:1.0.0-alpha05。点击此处可查看此版本中包含的提交内容。

API 变更

  • BenchmarkState.reportData API 现标记为实验性

问题修复

  • 修复了时钟锁定脚本,该脚本在缺少 cutexpr shell 实用程序的设备上将失败。
  • 修复了 ./gradlew lockClocks 任务的问题,在以 su 实用程序的较旧版本(不支持 -c 标记)启用 root 权限的设备上该任务会暂挂。

版本 1.0.0-alpha04

2019 年 8 月 7 日

发布了 androidx.benchmark:benchmark-common:1.0.0-alpha04androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha04androidx.benchmark:benchmark-junit4:1.0.0-alpha04。点击此处可查看此版本中包含的提交内容。

此外还添加了有关如何在不使用 Gradle 的情况下使用 Benchmark 库的新文档,两者可用于不同的编译系统(例如 Bazel 或 Buck),以及在 CI 中运行时。如需了解详情,请参阅在不使用 Gradle 的情况下编译基准在持续集成中运行基准

新功能

  • Gradle 插件
    • 现在自动停用测试覆盖范围,并默认设置 AndroidBenchmarkRunner (b/138374050)
    • 增加了在运行基准和使用 AGP 3.6+ 时,对基于 AGP 的新数据副本的支持
  • 添加了 JSON 格式
    • 输出总基准测试运行时间 (b/133147694)
    • 现在,使用名称字符串(例如 @Parameters(name = "size={0},depth={1}"))的 @Parameterized 基准以 JSON 输出格式输出每个基准的参数名称和值 (b/132578772)
  • 模拟运行模式 (b/138785848)
    • 添加了“模拟运行”模式,仅运行每个基准循环一次以检查是否有错误/崩溃,而不捕获测量值。该模式非常有用,例如可在预提交中快速运行基准,以确认它们未损坏。

API 变更

  • 更改了模块结构,拆分了库 (b/138451391)
    • benchmark:benchmark-junit4 包含具有 JUnit 依赖项的类:AndroidBenchmarkRunnerBenchmarkRule。这两个类均已移入 androidx.benchmark.junit4 软件包中
    • benchmark:benchmark-common 包含其余逻辑,其中包括 BenchmarkState API
    • 通过这种拆分,该库将来可以在没有 JUnit4 API 的情况下支持基准化分析
  • 配置警告现在被视为错误,并且会使测试崩溃 (b/137653596)
    • 这样做是为了进一步鼓励准确测量,尤其是在 CI 中
    • 可以使用插桩参数将这些错误回退为警告。例如:-e androidx.benchmark.suppressErrors "DEBUGGABLE,LOW_BATTERY"

问题修复

  • 写入 Q 设备上的外部存储空间时出现的错误会提供更具描述性的消息,并提供有关如何解决相应问题的建议
  • 在基准运行期间,屏幕会自动打开,而不是在屏幕关闭时失败

外部贡献

  • 感谢 Sergey Zakharov 为 JSON 输出改进以及修复屏幕关闭问题做出的贡献!

版本 1.0.0-alpha03

2019 年 7 月 2 日

发布了 androidx.benchmark:benchmark:1.0.0-alpha03androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha03。点击此处可查看此版本中包含的提交内容。

新功能

  • 在完整的 JSON 报告中公开每个基准因热节流而导致的休眠持续时间

问题修复

  • 在 Android 插件和 Android 块之后,不再需要应用 Gradle 插件
  • 在使用分区存储的 Android 10 设备上添加了对基准报告的支持

版本 1.0.0-alpha02

2019 年 6 月 6 日

发布了 androidx.benchmark:1.0.0-alpha02androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha02。点击此处可查看此版本中包含的提交内容。

请注意,我们将 JSON 架构视为 API。我们计划遵循与其他 API 相同的稳定性约束:进入 Beta 版后架构即告稳定(极偶尔会有例外情况),最终版本中会修复所有相关问题,次要版本中只会添加新特性,而只会在主要版本中更改/移除特性。

API 变更

  • 翻新了 JSON 架构。对 JSON 架构的后续更改很可能仅限于新增特性:

    • 重新组织了结果对象结构,以支持将来的更多指标组 (b/132713021)
    • 在顶级对象中添加了测试运行上下文信息(例如,设备和 build 信息以及时钟是否处于锁定状态)(b/132711920)
    • 现在,时间指标名称中带有“ns”(b/132714527)
    • 扩充了每个报告指标的统计信息(最大值、中位数、最小值),并移除了简化的“nanos”摘要统计信息 (b/132713851)
  • 移除了 XML 输出 (b/132714414)

  • BenchmarkState.reportData API 中移除了热限制检测 (b/132887006)

问题修复

  • 修复了 ./gradlew lockClocks 在某些最新的操作系统设备上不粘滞的问题 (b/133424037)
  • 停用了模拟器的限制检测 (b/132880807)

版本 1.0.0-alpha01

2019 年 5 月 7 日

发布了 androidx.benchmark:benchmark:1.0.0-alpha01。点击此处可查看此版本中包含的提交内容。