Nashorn在JDK 9和JDK 10上的性能

时间:2018-07-30 19:35:24

标签: java java-9 nashorn java-10

如果您在JDK 8上使用Nashorn解释moment.js库,它将在几秒钟内运行:

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 个答案:

答案 0 :(得分:12)

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字节码,   错误的类型猜测将导致更长的预热时间。乐观打字   当前默认情况下处于启用状态,但可以更快地禁用它   启动性能。

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