【问题标题】:Nashorn performance on JDK 9 and JDK 10JDK 9 和 JDK 10 上的 Nashorn 性能
【发布时间】:2018-07-30 19:35:24
【问题描述】:

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

时间 .../JDK8/bin/jjs moment-with-locales-2.22.2.js 实际0m2.644s 用户 0m10.059s 系统 0m0.287s

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

时间.../JDK10/bin/jjs moment-with-locales-2.22.2.js 实际0m27.308s 用户 0m59.690s 系统 0m1.353s

这实际上慢了十倍。只有我吗?

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

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

【问题讨论】:

    标签: java java-9 nashorn java-10


    【解决方案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 字节码, 错误的类型猜测会导致更长的预热时间。乐观打字 当前默认启用,但可以禁用更快 启动性能。

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

    【讨论】:

    • 非常有趣——感谢您的指点。我仍然对存在这样的差异感到有点震惊,但更多的测试确实证实这只是在启动时。如果你一次又一次地执行相同的 JS 代码,你只需要付出一次代价,但这是一个沉重的代价!我猜 moment.js 的编译非常昂贵,因为它必须重新编译很多次。它不是那么大(~50K),所以对于更大的 JS 库来说是个坏兆头。
    • 跟进——我们现在默认禁用乐观类型优化:jsEngine = nashornEngineFactory.getScriptEngine(new String[] { "--optimistic-types=false" }); 这使我们的启动时间与 JDK 8 更加一致,代价是优化较少.再次感谢您的帮助!
    • @MaxTardiveau 如果我的回答对您有帮助并回答了您的问题,您可以接受。
    猜你喜欢
    • 1970-01-01
    • 2019-07-14
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多