【译文】Java 22 的速度有多快?

随着 Java 22 发布日期的临近,我们对其时间折叠求解器的性能进行了例行检查。请继续阅读,了解解算器在 Java 22 上的性能与 Java 21 相比如何。这次还包括 GraalVM!

但首先,让我们先了解一些情况。

什么是 Java 22?

Java 22 是 Java 平台的新版本,是 Timefold Solver 所使用的编程语言。它带来了大量新功能,以及常见的错误修复和较小的改进。

Java 22 将于 2024 年 3 月 19 日全面上市,但您已经可以使用候选发布版进行试用。我们发现开始使用 Java 22 的最简单方法是使用 SDKMAN,我们也是这么做的。我们还决定为 JDK 22 测试 GraalVM。您可能知道 GraalVM 是原生运行 Java 的工具,但今天我们实际上指的是 GraalVM 提供的常规 JDK 发行版。

虽然 Java 22 可能无法获得长期支持,但尝试一下仍不失为一个好主意,这样可以确保代码状态良好,并为下一个 LTS 做好准备。对于 Timefold Solver 而言,这意味着要确保整个代码库在 Java 22 上继续完美运行,并运行一些基准测试,以确保我们的用户至少可以期待与之前相同的性能。让我们开始吧。

微基准测试

我们将从分数主管微基准开始,我们经常使用这些基准来确定各种变化对 Constraint Streams 性能的影响。这些基准测试并不运行整个求解器,而是只关注求解器的分数计算部分。

它们使用 Java Microbenchmark Harness (JMH) 实现,在许多 Java 虚拟机 (JVM) 分叉中运行,并进行了充分的预热。这使我们对结果有很强的信心。事实上,这些数据的误差率仅为 ± 2%。

下面是 Constraint Streams 在 Java 22 与 Java 21 上的性能对比:

除一种情况外,OpenJDK 22 和 21 之间的差异都在基准误差范围之内。这意味着我们在两个版本之间没有观察到明显的性能变化。网球 “基准是唯一的异常值,我们有兴趣对其进行研究并找出原因。

更有趣的发现是,JDK 22 的 GraalVM 比 OpenJDK 22 快很多!在所有基准测试中,GraalVM 的平均性能提高了 ~5%,在 “会议调度 “基准测试中最高提高了 ~15%,因此 GraalVM 绝对值得您考虑用于 Timefold Solver 应用程序。

值得注意的是,我们在运行这些基准测试时使用了 ParallelGC 作为垃圾回收器 (GC),而不是默认的 G1GC。我们之所以做出这样的选择,是因为 ParallelGC 在过去一直是求解器的最佳 GC,因为求解器最看重的是吞吐量而不是延迟。

实际基准测试

既然我们已经看过了微基准测试,现在是时候将它们与实际求解器性能进行比较了。这包括整个求解器,而不仅仅是分数计算部分。

我们在 10 个不同的 JVM 分叉中手动运行求解器,并使用分数计算速度的中位数。为了缩短运行时间,我们选择了可用基准中的一个子集;从所使用的启发式方法和代码路径的角度来看,该选择代表了整个基准套件。我们再次使用 ParallelGC 作为垃圾回收器。结果如下

这些数据证实了微基准测试的结果。OpenJDK 22 和 OpenJDK 21 之间的差异可以忽略不计,而用于 JDK 22 的 GraalVM 则带来了高达 10% 的改进。

由于我们还没有为这些大型基准测试建立正式的置信区间,因此我们无法确定这些改进是否具有统计意义。不过,运行之间的波动很小,足以让我们对结果充满信心。

结论

在这篇文章中,我们已经证明了

Timefold Solver 1.8.0 可以在 Java 22 中完美运行,无需进行任何更改。对于我们 Timefold 来说,切换到最新版本的 Java 可谓轻而易举,这也证明了 Java 的向后兼容性承诺。

切换到 Java 22 可能不会给求解器带来任何性能改进或倒退。

适用于 JDK 22 的 GraalVM 可为求解器带来高达 10% 的性能提升。

尽管 OpenJDK 22 并没有为我们带来任何性能提升,但我们仍然鼓励您尝试 Java 22。毕竟它是免费的,而且您还能享受到最新、最棒的 Java 平台。

附录 A:结果重现

这些基准测试使用的是 Timefold Solver 1.8.0(本文撰写时的最新版本)。

所有基准测试均在 Fedora Linux 39 上运行,CPU 为英特尔酷睿 i7-12700H,内存为 32 GB。我们使用了以下 JDK 发行版:

  • OpenJDK Runtime Environment Temurin-21.0.2+13 (21.0.2+13-LTS),在 SDKMAN 上的版本为 21.0.2-tem。
  • OpenJDK Runtime Environment 22.ea.36 (22+36-2370),在 SDKMAN 上以 22.ea.36-open 的形式提供。
  • GraalVM for JDK 22.ea.06 (22-dev+36.1),可在 Github 上获取。

微基准的源代码可在我的个人仓库中找到。实际基准测试使用 timefold-solver-benchmark 运行,配置如下。(图表使用的原始数据可在此电子表格中找到。

本文文字及图片出自 How fast is Java 22?

余下全文(1/3)
分享这篇文章:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注