Nashorn 在 JDK 9 和 JDK 10 上的表现

2022-09-03 07:04:25

如果你解释这个时刻.js在JDK 8上使用Nashorn的库,它会在几秒钟内运行:

time .../JDK8/bin/jjs moment-with-locales-2.22.2.js
real    0m2.644s
user    0m10.059s
sys     0m0.287s

但是在JDK 9或10上做同样的事情,这很糟糕:

time .../JDK10/bin/jjs moment-with-locales-2.22.2.js
real    0m27.308s
user    0m59.690s
sys     0m1.353s

这实际上要慢十倍。只是我吗?

我知道Nashorn将被弃用,但是在它受到支持时它不应该正常工作吗?

有什么建议吗?解决方法?


答案 1

Nashorn 可以使用“乐观类型”(下文详细介绍),它们在 Java 9 及更高版本中默认处于打开状态,但它们会在启动时导致延迟。

关闭乐观类型可产生:

$ time jjs --optimistic-types=false moment-with-locales.js
real    0m4.282s
user    0m0.000s
sys     0m0.015s

开关可以缩写为 。-ot=false

jjs -h定义乐观类型如下:

将乐观类型假设与取消优化的重新编译结合使用。这使得编译器对于任何无法在编译时证明其类型的程序符号,尝试将其键入尽可能窄和原始的类型。如果运行时由于符号类型太窄而遇到错误,则将生成一个更广泛的方法,直到达到稳定阶段。虽然这会生成尽可能最佳的 Java 字节码,但错误的类型猜测将导致更长的预热时间。默认情况下,乐观类型当前处于启用状态,但可以禁用以提高启动性能。

因此,从长远来看,乐观类型可能会产生更快的性能(尽管不能保证),但会导致启动速度变慢。


答案 2

推荐