这篇文章主要讲解了“Java8新特性jjs工具怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java8新特性jjs工具怎么使用”吧!
主要是两个方面,jjs工具以及javax.script包下面的API:
jjs是在java_home/bin下面自带的,作为例子,让我们创建一个func.js, 内容如下:
?
1 2 |
function f) {return 1;}; print f) + 1 ); |
运行这个文件,把这个文件作为参数传给jjs
?
1 |
jjs func.js |
输出结果:2
另一个方面是javax.script,也是以前Rhino余留下来的API
?
1 2 3 4 |
ScriptEngineManager manager = new ScriptEngineManager); ScriptEngine engine = manager.getEngineByName "JavaScript" ); System.out.println engine.getClass).getName) ); System.out.println "Result:" + engine.eval "function f) { return 1; }; f) + 1;" ) ); |
输出如下:
jdk.nashorn.api.scripting.NashornScriptEngine
Nashorn VS Rhino
javascript运行在jvm已经不是新鲜事了,Rhino早在jdk6的时候已经存在,但现在为何要替代Rhino,官方的解释是Rhino 相比其他javascript引擎(比如google的V8)实在太慢了,要改造Rhino还不如重写。既然性能是Nashorn的一个亮点,下面就测试 下性能对比,为了对比两者之间的性能,需要用到Esprima,一个ECMAScript解析框架,用它来解析未压缩版的jquery(大约268kb),测试核心代码如下:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
static void rhinoString parser, String code) { String source = "speedtest"; int line = 1; Context context = Context.enter); context.setOptimizationLevel9); try { Scriptable scope = context.initStandardObjects); context.evaluateStringscope, parser, source, line, null); ScriptableObject.putPropertyscope, "$code", Context.javaToJScode, scope)); Object tree = new Object); Object tokens = new Object); for int i = 0; i < RUNS; ++i) { long start = System.nanoTime); tree = context.evaluateStringscope, "esprima.parse$code)", source, line, null); tokens = context.evaluateStringscope, "esprima.tokenize$code)", source, line, null); long stop = System.nanoTime); System.out.println"Run #" + i + 1) + ": " + Math.roundstop – start) / 1e6) + " ms"); } } finally { Context.exit); System.gc); } } static void nashornString parser, String code) throws ScriptException,NoSuchMethodException { ScriptEngineManager factory = new ScriptEngineManager); ScriptEngine engine = factory.getEngineByName"nashorn"); engine.evalparser); Invocable inv = Invocable) engine; Object esprima = engine.get"esprima"); Object tree = new Object); Object tokens = new Object); for int i = 0; i < RUNS; ++i) { long start = System.nanoTime); tree = inv.invokeMethodesprima, "parse", code); tokens = inv.invokeMethodesprima, "tokenize", code); long stop = System.nanoTime); System.out.println"Run #" + i + 1) + ": " + Math.roundstop – start) / 1e6) + " ms"); } // System.out.println"Data is " + tokens.toString) + " and " + tree.toString)); } |
从代码可以看出,测试程序将执行Esprima的parse和tokenize来运行测试文件的内容,Rhino和Nashorn分别执行30次, 在开始时候,Rhino需要1726 ms并且慢慢加速,最终稳定在950ms左右,Nashorn却有另一个特色,***次运行耗时3682ms,但热身后很快加速,最终每次运行稳定在 175ms,如下图所示
nashorn首先编译javascript代码为java字节码,然后运行在jvm上,底层也是使用invokedynamic命令来执行,所以运行速度很给力。
为何要用java实现javascript
这也是大部分同学关注的点,我认同的观点是:
-
成熟的GC
-
成熟的JIT编译器
-
多线程支持
-
丰富的标准库和第三方库