JEP 230: Microbenchmark Suite | 微基准测试套件
摘要
向 JDK 源代码中添加一套基本的微基准测试套件,并使开发者能够轻松地运行现有的微基准测试以及创建新的微基准测试。
目标
- 基于 [Java 微基准测试框架(JMH)] [1]
- 稳定且经过优化的基准测试,针对持续的性能测试
- 在功能发布的特性完整里程碑之后,以及非特性发布中,保持一个稳定且不变的套件
- 支持与适用测试的前一个 JDK 版本进行比较
- 简单易用
- 易于添加新的基准测试
- 随着 API 和选项的更改、弃用或删除,易于更新测试
- 易于构建
- 易于查找和运行基准测试
- 支持 JMH 更新
- 在套件中包含大约一百个基准测试的初始集合
非目标
并不是为了为新 JDK 特性提供基准测试。为新特性添加基准测试将作为这些项目的一部分进行。
并不是为了创建一个完整的基准测试集来覆盖 JDK 中的所有内容。这个套件将随着时间的推移通过编写新的基准测试或通过特别针对扩展其覆盖范围的努力来继续扩展。
并不是为了提供一个处理微基准测试中二进制依赖项的解决方案。对此的支持可能会在后续添加。
描述
微基准测试套件将与 JDK 源代码一起位于同一个目录中,并在构建时生成一个单独的 JAR 文件。这种共存的方式将简化在开发过程中添加和定位基准测试的过程。在运行基准测试时,JMH 提供了强大的过滤功能,允许用户仅运行当前感兴趣的基准测试。确切的位置尚未确定。
基准测试通常需要与早期构建甚至早期版本进行比较,因此微基准测试必须支持 JDK(N),用于针对新 JDK 中特性的基准测试,以及 JDK(N-1),用于针对早期版本中现有特性的基准测试。这意味着对于 JDK 12,结构和构建脚本必须支持为 JDK 12 和 JDK 11 编译基准测试。基准测试将进一步通过描述它们正在测试的 JDK 区域的 Java 包名来划分。
以下是建议的目录结构:
jdk/jdk
.../make/test(用于Makefile的共享文件夹)
.../test(用于功能测试的共享文件夹)
.../micro/org/openjdk/bench
.../java(与JDK包和模块类似的子目录)
.../vm(与HotSpot组件类似的子目录)
微基准测试套件的构建将与正常的 JDK 构建系统集成。它将是一个单独的目标,在正常的 JDK 构建过程中不会执行,以保持对开发人员和其他不感兴趣构建微基准测试套件的人的低构建时间。要构建微基准测试套件,用户需要专门运行 make build-microbenchmark
或类似的命令。此外,还支持使用 make test TEST="micro:regexp"
来运行基准测试。关于如何设置本地环境的说明将在 docs/testing.md|html
中记录。
基准测试将都依赖于 JMH,这与一些单元测试依赖于 TestNG 或 jtreg 的方式非常相似,因此虽然对 JMH 的依赖是新的,但构建的其他部分也有类似的依赖。与 jtreg 的一个不同之处是,JMH 既在构建过程中使用,也作为生成的 JAR 文件的一部分进行打包。
微基准测试套件中的基准测试集将从 JMH JDK Microbenchmarks 项目中导入。[2] 这些已经是一组经过调优和测试的微基准测试,目前已在内部使用。一个未解决的问题是是否将整个独立的项目迁移到同一位置的套件中,还是将其保留为更长期回归测试的稳定森林。
然而,任何用户在进行分析时仍应确保其他参数(如执行机器和 JDK)是稳定和可比较的。基准测试通常预期能在不到一分钟的时间内完成一次完整的运行。这并不是为大型或长时间运行的基准测试设计的包装框架;目标是提供一套快速且有针对性的基准测试。在某些特殊情况下,基准测试可能需要更长的预热时间或运行时间才能获得稳定的结果,但应尽可能避免这种情况。该套件的目标不是作为更大工作负载的一般包装器;相反,其意图是从更大的基准测试中提取关键组件或方法,并将其作为微基准测试进行压力测试。
作为此项目的一部分,将在 wiki.openjdk.java.net 上创建一个新页面,以帮助解释如何开发新的基准测试,并描述添加基准测试的要求。这些要求将强制要求遵守编码标准、可重复的性能以及基准测试和测量内容的清晰文档。
备选方案
将微基准测试套件作为独立项目继续维护 [2:1]。
将基准测试套件与项目放在一起可以简化为新功能添加基准测试,尤其是在大多数新功能开发都在项目仓库(如 Valhalla、Amber 等)中完成的情况下。在独立项目模型中,一个特别复杂的情况是测试对 javac 本身的更改,这需要使用各自的 JDK 明确重建基准测试套件。将基准测试套件与项目放在一起可以更优雅地解决这一特定用例,同时并不禁止使用预构建的基准测试包来跟踪稳定测试在较长时间内的性能。
测试
性能团队将作为常规性能测试的一部分来验证微基准测试,以确保只添加稳定、调优和准确的微基准测试。还会根据具体情况对基准测试进行评估和剖析,以确保它测试了预期的功能。所有测试必须在所有适用的平台上多次运行,以确保其稳定性。
风险
JDK 构建将依赖于 JMH 的一个版本。JDK 构建系统需要能够下载或以其他方式访问 JMH 的二进制版本,并且当需要更新到 JMH 的新版本时,应该能够以合理的努力进行更新。这应该是一个容易解决的问题,因为我们已经有类似 TestNG 和其他库的依赖项。JMH 的依赖项仅对尝试构建微基准测试套件的人可见;其他构建目标不依赖于 JMH。
构建时间的显著增加。基准测试套件不是常规开发人员 JDK 构建所必需的;它将是一个单独的构建目标。
新基准测试中的潜在测试不稳定性。需要对每个添加的基准测试进行彻底的审查和测试。
源代码仓库大小的增加。顾名思义,微基准测试很小,但随着时间的推移,我们希望它们会形成一个庞大的集合。主要的尺寸增加将来自需要在仓库外部处理的资源。
需要二进制存储来允许创建某些类型的基准测试。一些基准测试依赖于外部库或大型静态资源,如 XML 文档和用作基准测试一部分的源代码文件。我们目前没有解决这个问题的方案,但这只会限制具有这种依赖性的基准测试。小型非二进制资源可能允许作为微基准测试源代码的一部分。
依赖项
微基准测试套件将依赖于 Java Microbenchmark Harness 版本 1.12 或更高版本。