【问题标题】:Nashorn js eval is much slower than rhino jsNashorn js eval 比 rhino js 慢很多
【发布时间】:2017-04-26 23:46:27
【问题描述】:

示例程序

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
System.out.println(jsEngine.eval("a>10 || b<10 || c=10"));

在我的程序中,我使用上面的代码来评估 1000 个使用 javascript 函数的表达式,例如 indexof()、replace、date 函数等等。这种表达式曾经在 rhino 中进行评估(当平台 java 版本是java 7) 比 nashorn 快得多....我应该说至少快 15~20 倍....

在 Java 8 中使用 rhino 似乎是一项乏味的工作...有人可以建议解决方法以使其更快...

【问题讨论】:

  • 你是如何测量速度的?你有一些实际比较执行时间的示例代码吗?
  • 解决方法:实现自己的解析器?它们似乎是简单的逻辑表达式。
  • @markspace 我只是举了一个简单表达式的例子,但是我们使用了很多 javascript 函数,例如 indexof()、replace、date 和许多......我会更新问题
  • @pvg 我刚刚做了一组表达式,在java7(rhino)和java8(nashorn)上运行,比较了时间差
  • @Attila Szegedi 给出了答案并且它奏效了......最好解释为什么人们对这个问题投了反对票

标签: javascript java rhino nashorn


【解决方案1】:

Rhino 有一个解释器,Nashorn 将每个表达式编译为 JVM 字节码,然后在内部加载并运行如此生成的 JVM 类。因此,除了解析之外,每个 eval 都会产生字节码生成和 JVM 类加载成本。

您可以做的一件事是将脚本引擎转换为Compilable,并使用它来创建CompiledScript 以进行重复调用。

如果您有许多曾经评估过的表达式,这将无济于事,但对于经常评估的表达式会有所帮助。

【讨论】:

  • 感谢您的回答,此更改后效果非常好,性能大大提高
猜你喜欢
  • 2022-06-10
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 2014-01-14
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多