注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

0与1构筑世界,程序员创造时代

软件架构设计 Java编程

 
 
 

日志

 
 

在JVM中编译脚本提升运行性能  

2013-12-12 17:21:44|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
JDK6增加了一个重要的特性,实现JSR 223规范支持脚本语言,使得Java可以通过脚本引擎执行JavaScript,Python等脚本语言代码。JDK6包含了一个基于Mozilla Rhino的 脚本语言引擎,支持JavaScript。其他的脚本语言可以按JSR 223规范实现脚本引擎,JDK中有一个ScriptEngineManager类,它可以通过jar服务发现(Service Discovery)机制寻找合适的脚本引擎类(ScriptEngine)。
脚本语言给人第一印象,它是逐行解释执行的,但JSR 223规范定义了脚本两种不同的运行方式:
  • 解释运行。
  • 先编译,后运行。
是否支持编译功能,由具体的脚本引擎决定。JDK6自带的JavaScript引擎同时支持解释运行和编译运行两种方式,下面就对比这两种方式下脚本运行的性能。

代码

完整的源代码
1、解释运行。关键代码如下:
public void parse(String script, Map<String, Object> varsthrows ScriptException {
    ScriptEngine scriptEngine = getScriptEngine("javascript");
    long startTime = System.currentTimeMillis();
    for (int i = 0; i < COUNT; i++) {
        Bindings binds = createBinding(vars, scriptEngine);
       scriptEngine.eval(script, binds);
    }
    long usedTime = System.currentTimeMillis() - startTime;
    System.out.printlnString.format("每次都解释脚本执行%d次消耗%d毫秒", COUNT, usedTime) );
}

2、先编译,再运行。关键代码如下:
public void compile(String script, Map<String, Object> varsthrows ScriptException {
    ScriptEngine scriptEngine = getScriptEngine("javascript");
    Compilable compileEngine = (CompilablescriptEngine;
    CompiledScript compileScript = compileEngine.compile(script);
    long startTime = System.currentTimeMillis();
    for (int i = 0; i < COUNT; i++) {
        Bindings binds = createBinding(vars, scriptEngine);
        compileScript.eval(binds);
    }
    long usedTime = System.currentTimeMillis() - startTime;
    System.out.printlnString.format("编译脚本后执行%d次消耗%d毫秒", COUNT, usedTime) );
}

性能对比

测试环境,运行在VirtualBox中的虚拟机:
操作系统:Redhat 5.7 64bit
CPU:Intel(R) Core(TM) i3 CPU M380@2.53GHz * 2
内存:2.5GB

跑了四次测试,结果如下:
  运行次数 解释运行(单位:毫秒) 先编译再运行(单位:毫秒)
 第一次  100000  16898  15129
 第二次  100000  15704  14291
 第三次  100000  17724  14938
 第四次  100000  16987  14828

在JVM中编译脚本提升运行性能 - 傲风 - 宝剑锋从磨砺出 梅花香自苦寒来注:在高并发的场景中,两种方式的性能差距比上述结果要大。

<正文结束>

文章声明


作者:傲风(aofengblog@163.com)       编写时间:2013年12月12日

网址:http://aofengblog.blog.163.com

作者保留所有权利,转载请保留文章全部内容或者说明原作者和转载地址!

  评论这张
 
阅读(638)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017