« | September 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 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 | | | | | |
| 公告 |
戒除浮躁,读好书,交益友 |
Blog信息 |
blog名称:邢红瑞的blog 日志总数:523 评论数量:1142 留言数量:0 访问次数:9714138 建立时间:2004年12月20日 |

| |
[脚本语言]动态脚本的编译 原创空间, 软件技术, 电脑与网络
邢红瑞 发表于 2006/5/24 11:00:22 |
Sun的 Java 6使用Rhino (the Mozilla 100% Java Javascript实现),一般来说,脚本的运行速度不如java语言,因为java语言毕竟是编译过的,脚本每次都会被解析和解释,例如下面的代码 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); Bindings bindings = engine.createBindings(); bindings.put("num", "20"); Object result = engine.eval( "fib(num);" + "function fib(n) {" + " if(n <= 1) return n; " + " return fib(n-1) + fib(n-2); " + "};", bindings); System.out.println(result);时间2秒但是Rhino Javascript engine可以编译脚本的例如下面的代码 Map<String, CompiledScript> m = new HashMap<String, CompiledScript>();// ... ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); CompiledScript script = m.get("fib"); if(script == null) { Compilable compilingEngine = (Compilable)engine; script = compilingEngine.compile( "fib(num);" + "function fib(n) {" + " if(n <= 1) return n; " + " return fib(n-1) + fib(n-2); " + "};" ); m.put("fib", script); } Bindings bindings = engine.createBindings(); bindings.put("num", "20"); Object result = script.eval(bindings); System.out.println(result);时间0秒,但是多个脚本引擎的实现,就不要编译了,使用一下代码Map<String, CompiledScript> m = new HashMap<String, CompiledScript>();// ...ScriptEngineManager manager = new ScriptEngineManager();ScriptEngine engine = manager.getEngineByName("js");Bindings bindings = engine.createBindings();bindings.put("num", "20");if(engine instanceof Compilable) { CompiledScript script = m.get("fib"); if(script == null) { Compilable compilingEngine = (Compilable)engine; script = compilingEngine.compile( "fib(num);" + "function fib(n) {" + " if(n <= 1) return n; " + " return fib(n-1) + fib(n-2); " + "};" ); m.put("fib", script); } script.eval(bindings);}else { engine.eval(r, bindings);} |
|
|