- 适用于 JDK 23 的 GraalVM(最新版)
- 适用于 JDK 24 的 GraalVM(抢先体验版)
- 适用于 JDK 21 的 GraalVM
- 适用于 JDK 17 的 GraalVM
- 存档
- 开发版本
报告性能问题
如果您发现 TruffleRuby 的性能比其他 Ruby 实现低,我们希望您能告知我们。请在 GitHub 上报告您可能遇到的任何性能问题。
在 兼容性 指南中列出了一些我们已知的性能较慢且不太可能得到改善的功能。
常见问题及其原因 #
TruffleRuby 使用极其复杂的技术来优化您的 Ruby 程序。这些优化需要时间才能应用,因此 TruffleRuby 通常比其他实现要慢得多,直到它有时间预热。
此外,TruffleRuby 会尝试找到您的程序的“稳定状态”,然后在不需要的地方自动移除 Ruby 的动态性,但这意味着如果稳定状态被打乱,性能会再次降低,直到 TruffleRuby 能够适应新的稳定状态。
另一个问题是 TruffleRuby 在删除不必要的操作方面非常出色,例如不需要的计算或不包含任何操作的循环。
所有这些问题使得对 TruffleRuby 进行基准测试变得很困难。这并不是一个独特的问题——它适用于许多复杂的虚拟机——但大多数 Ruby 实现尚未执行足够强大的优化来显示这些问题,因此对于 Ruby 社区中的一些人来说,这些问题可能是新的。
使用 Oracle GraalVM #
要体验 TruffleRuby 的速度,请使用 Oracle GraalVM.
使用 JVM 配置 #
为了获得最佳峰值性能,请使用 JVM 配置,使用 --jvm
。默认的原生配置启动速度更快,但达不到相同的峰值性能。但是,您必须使用一个好的基准测试工具(例如下面描述的 benchmark-ips
)来运行基准测试,否则较慢的预热时间会导致您无法在基准测试中看到 TruffleRuby 的真实性能。如果您想编写更简单的基准测试,只需运行一个带有简单计时器的循环(我们不建议这样做),那么使用默认的原生模式,这样启动和预热时间就会更短。
如何检查基本性能问题 #
如果您要检查 TruffleRuby 的性能,我们建议您始终使用 --engine.TraceCompilation
标志运行。如果您看到编译失败或重复编译相同的方法,这表明某些内容没有按预期工作,您可能需要检查原因,或者请我们帮助您进行检查。如果您没有使用此标志运行,TruffleRuby 将尝试绕过错误,您将看不到问题。
如何编写性能基准测试 #
TruffleRuby 团队建议您使用 benchmark-ips
来检查 TruffleRuby 的性能。如果您使用 benchmark-ips
的报告报告任何潜在的性能问题,这将使我们更容易解决问题。
基准测试可能如下所示
require 'benchmark/ips'
Benchmark.ips do |x|
x.iterations = 2
x.report("adding") do
14 + 2
end
end
我们在 benchmark-ips
中使用 x.iterations =
扩展来运行 benchmark-ips
的预热和测量循环两次,以确保结果稳定,并且提供了足够的预热(可以使用 x.warmup = 5
进行调整)。
您应该看到类似以下内容
Warming up --------------------------------------
adding 20.933k i/100ms
adding 1.764M i/100ms
Calculating -------------------------------------
adding 2.037B (±12.7%) i/s - 9.590B in 4.965741s
adding 2.062B (±11.5%) i/s - 10.123B in 4.989398s
我们想查看最后一行,它表明 TruffleRuby 每秒运行此块的 20.62 亿次迭代,误差幅度为 ±11.5%。
将其与 Rubinius 等实现进行比较
Warming up --------------------------------------
adding 71.697k i/100ms
adding 74.983k i/100ms
Calculating -------------------------------------
adding 2.111M (±12.2%) i/s - 10.302M
adding 2.126M (±10.6%) i/s - 10.452M
在这里,TruffleRuby 的性能可以描述为比 Rubinius 快一千倍。这似乎很多——实际上发生的事情是 TruffleRuby 正在优化您的基准测试。对于无法优化的复杂代码,效果不那么明显。
最终技术说明:黑洞和值分析 #
其他语言的一些基准测试工具具有称为“黑洞”的功能。这些功能围绕一个值,使其在运行时看起来像一个变量,即使它实际上是一个常量,这样优化器就不会删除它,并且实际上会执行使用它的任何计算。但是,TruffleRuby 使用了广泛的值分析(值的缓存和将其转换为常量),因此即使您在源代码中使一个值看起来像一个变量,它也可能在中间阶段被值分析。总的来说,更复杂的基准测试(自然地击败了值分析)比手动添加注释来关闭重要功能更可取。