犀牛JS的eval比犀牛JS

问题描述:

示例程序犀牛JS的eval比犀牛JS

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

在我的节目我用上面的代码来计算表达式的1000年,它使用JavaScript函数一样的indexOf(),更换日期函数和许多慢得多more.This类型的表达式曾被评估在犀牛(当平台Java版本是Java 7)比nashorn速度更快....我应该说至少15〜20倍更快....

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

+0

你如何测量速度?你有一些实际比较执行时间的示例代码吗? – pvg

+0

解决方法:实现您自己的解析器?他们似乎是简单的逻辑表达。 – markspace

+0

@markspace我刚刚给了简单表达式的例子,但我们正在使用如此多的javascript函数,如indexof(),替换,日期和很多...我将更新问题 – Hadooplearner

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

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

如果您有很多经过一次评估的表达式,这将无济于事,但它对经常评估的表达式有帮助。

+0

感谢您的答案,它的工作非常出色在这种变化之后,性能有了很大提高 – Hadooplearner