Max*_*eau 14 java nashorn java-9 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会被弃用,但是如果它得到支持它会不能正常工作?
有什么建议?解决方法?
Dav*_*rad 12
Nashorn可以使用"乐观类型"(下面更多),默认情况下它们在Java 9及更高版本中打开,但它们会导致启动延迟.
关闭乐观类型会产生:
$ time jjs --optimistic-types=false moment-with-locales.js
real 0m4.282s
user 0m0.000s
sys 0m0.015s
Run Code Online (Sandbox Code Playgroud)
开关可以缩写-ot=false.
jjs -h 定义乐观类型如下:
使用乐观类型假设和去优化重新编译.这使得编译器尝试对于在编译时无法证明其类型的任何程序符号,将其键入尽可能窄和原始的类型.如果运行时遇到错误,因为符号类型太窄,则会生成更宽的方法,直到达到稳定阶段.虽然这会产生尽可能最佳的Java字节码,但错误的类型猜测会导致更长的预热.默认情况下,当前启用了乐观类型,但可以禁用它以获得更快的启动性能.
因此,乐观类型可能会在长期内产生更快的性能(虽然这不能保证),但会导致启动速度变慢.