如果您在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将被弃用,但在受支持的情况下是否应该无法正常工作?
有什么建议吗?解决方法?
答案 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字节码, 错误的类型猜测将导致更长的预热时间。乐观打字 当前默认情况下处于启用状态,但可以更快地禁用它 启动性能。
因此,从长远来看,乐观打字可能会带来更快的性能(尽管不能保证),但会导致启动速度变慢。