JEP 230:微型基准测试套件
概述
在 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 (Shared folder for Makefiles)
.../test (Shared folder for functional tests)
.../micro/org/openjdk/bench
.../java (subdirectories similar to JDK packages and modules)
.../vm (subdirectories similar to HotSpot components)
微基准测试套件的构建将会与常规的 JDK 构建系统集成。它会作为一个单独的目标,不会在常规的 JDK 构建过程中执行,以此来减少开发者以及其他不关心微基准测试套件构建的人员的构建时间。要构建微基准测试套件,用户必须明确运行 make build-microbenchmark
或类似的命令。此外,使用 make test TEST="micro:regexp"
运行基准测试也将得到支持。关于如何设置本地环境的说明将会记录在 docs/testing.md|html
文件中。
这些基准测试都将依赖于 JMH,这与某些单元测试依赖于 TestNG 或 jtreg 的方式非常相似。因此,虽然对 JMH 的依赖是新的,但构建的其他部分也有类似的依赖关系。与 jtreg 相比,一个不同之处在于 JMH 在构建过程中会被使用,并且会被打包为生成的 JAR 文件的一部分。
微基准套件中的基准测试集将从 JMH JDK 微基准项目中导入。[2] 这些构成了一组已经内部使用的经过调优和测试的微基准。一个悬而未决的问题是,是将这个独立的项目整体迁移到同地套件中,还是将其保留为一个更长期回归测试的稳定森林。
然而,任何用户在进行分析时,仍需确保执行机器和 JDK 等其他参数保持稳定且具备可比性。通常情况下,基准测试预计应在不到一分钟的时间内完成一次完整的运行。这并不是一个适用于大型或长时间运行基准测试的包装框架;其目标是提供一套快速且有针对性的基准测试。在某些特殊情况下,为了获得稳定的结果,基准测试可能需要更长的预热时间或运行时间,但应尽可能避免这种情况。该套件的目标并非充当较大工作负载的通用包装器;相反,其意图是从较大的基准测试中提取关键组件或方法,并仅对该部分进行微基准测试以施加压力。
作为该项目的一部分,wiki.openjdk.java.net 上将创建一个新页面,以帮助解释如何开发新的基准测试,并描述添加基准测试的要求。这些要求将强制遵守编码标准、可重现的性能以及对基准测试及其测量内容的清晰文档说明。
替代方案
继续将微基准测试套件作为一个单独的项目进行维护[2]。
共置简化了为新特性添加基准测试的过程,尤其是在大量新特性开发都在项目仓库(如 Valhalla、Amber 等)中完成的情况下。在分离项目模型中,有一个案例被证明特别复杂,那就是对 javac 本身的更改进行测试,这需要使用各个对应的 JDK 明确地重新构建基准测试套件。而共置可以更优雅地解决这一特定用例,同时也不会禁止使用预先构建的基准测试包来进行稳定测试的长期性能跟踪。
测试
微基准测试将由性能团队作为常规性能测试的一部分进行验证,以确保仅添加稳定、优化且准确的微基准测试。还将根据具体情况进行基准测试的评估和性能分析,以确保其测试预期的功能。所有测试必须在所有适用的平台上多次运行,以确保它们的稳定性。
风险
-
JDK 构建将依赖于某个版本的 JMH。JDK 构建系统需要能够下载或以其他方式访问 JMH 的二进制版本,并且在需要时必须能够以合理的努力更新到较新版本的 JMH。这应该是一个容易解决的问题,因为我们对 TestNG 和其他库有类似的依赖关系。JMH 依赖项仅对试图构建微基准测试套件的人可见;其他构建目标不依赖于 JMH。
-
构建时间显著增加。基准测试套件对于常规开发者 JDK 构建不是必需的;它将是一个单独的构建目标。
-
新基准测试中可能存在潜在的测试不稳定性。需要对每个新增的基准测试进行彻底的审查和测试。
-
源代码存储库大小增加。正如其名称所示,微基准测试很小,但随着时间推移,希望会有大量的微基准测试。主要的存储大小将归因于需要在存储库外部处理的资源。
-
需要提供二进制存储,以便创建某些类型的基准测试。一些基准测试依赖于外部库或大型静态资源,例如作为基准测试一部分使用的 XML 文档和源代码文件。我们目前对此没有解决方案,但这只会限制具有此类依赖性的基准测试。小型非二进制资源可能会作为微基准测试源代码的一部分被允许。
依赖
微基准测试套件将依赖于 Java 微基准测试工具版本 1.12 或更高版本。
[1] http://openjdk.java.net/projects/code-tools/jmh
翻译为中文:
[1] http://openjdk.java.net/projects/code-tools/jmh
(注:URL 通常不需要翻译,直接保留原文即可。)
[2] http://openjdk.java.net/projects/code-tools/jmh-jdk-microbenchmarks/
翻译:
[2] http://openjdk.java.net/projects/code-tools/jmh-jdk-microbenchmarks/
(此内容为链接,无需翻译正文,仅保留格式即可。)