java集成groovy优化

继前面一章讲到了groovy的使用方式,有loader以及engine,但是这两个方式的性能还是不能令我们满意,然后我们分析了下groovy的源码,看了下里面的实现逻辑,发现groovy在生成class文件之后(缓存class信息),在每次执行文件操作的时候都会new一个instance,这样做的意义在于engin里面使用binding参数,这样就需要每次生成实例,来产生对应的binding参数,源码如下:

try {
                if (Script.class.isAssignableFrom(scriptClass)) {
                    try {
                        Constructor constructor = scriptClass.getConstructor(Binding.class);
                        script = (Script) constructor.newInstance(context);
                    } catch (NoSuchMethodException e) {
                        // Fallback for non-standard "Script" classes.
                        script = (Script) scriptClass.newInstance();
                        script.setBinding(context);
                    }
                } 

所以,我这边就建立一个map来缓存实例,每次同一个文件执行的时候,先从缓存里面取,把参数通过方法的形式传到groovy里面,这样就减少了创建实例的时间,同时也减少了gc的次数,缓存代码如下:

public static Script createScript(String scriptName,GroovyScriptEngine engine,Binding binding) throws ResourceException, ScriptException {
        if (scriptMap.containsKey(scriptName)) {
            return scriptMap.get(scriptName);
        } else {
            Script script = engine.createScript(scriptName, binding);
            scriptMap.put(scriptName,script);
            return script;
        }
    }
性能如下:

效果还是很明显的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值