文档章节

groovy优化

星仔小号
 星仔小号
发布于 2014/10/17 16:05
字数 760
阅读 403
收藏 1
groovy语言的动态性,决定了groovy非常适合用在业务逻辑变更非常频繁的场景中,例如规则系统,一些实时接口,因此往往都会去做一个groovy引擎来执行这些脚本,本文提供一些方法优化groovy引擎
1,groovy源码预编译并本地缓存class类
    很显然,这是常见的优化方法,你不可能每次都去读取文件,或者从数据库读取脚本字符串来直接执行吧,这样效率太低,每次都会编译,生成一个新的类加载到内存里执行,这不仅浪费时间,而且增加了gc压力。所以合适的做法就是系统初始化时读取所有的脚本文件,编译后将字节码缓存到本地内存中,你可以使用一个hashmap来做,也可以用其他集中式缓存系统来做;编译后会转换成Script对象的实例,执行groovy时需要做一个engine单例来执行,由于脚本都是缓存起来的字节码且是单例,执行起来不用担心内存泄露。

2,DefaultGroovyMethods调用优化
     众所周知,groovy中很多函数调用都是通过反射进行的,而在java语言中,通过反射调用方法,比直接调用方法慢上几倍。那么dmg调用优化的思想就是在groovy代码中通过直接调用来代替反射调用,而要实现直接调用,则需要为DGM中的每个方法生成一个从MetaMethod派生的包装类,该类的invoke方法将直接调用DGM中对应的方法。
 
  那为什么不为用户写的Groovy程序的每一个方法,在运行时动态的创建这样直接调用的包装类,来提高每个方法的调用效率呢?那是因为这样会产生大量的类,由于每个类都是需要占用内存的,所以会对JVM用于存放类信息的PermGen内存区域造成压力,容易产生OutOfMemoryError。而DGM方法是Groovy程序中大量被调用的方法(即热点),而且数量只有不到1000个,因此适合为其生成包装类。 

3,自定义metaclasses优化
groovy的方法查找策略,默认先从this.getClass的metaClass里找,再从上下文里找。
当把一个java method放入groovy后,会自动被包装为org.codehaus.groovy.runtime.MethodClosure,如果本身就是java类,则无包装替换metaClass

    我们自定义一个MetaClassWrapper extends groovy.lang.MetaClassImpl,覆盖其public Object invokeMethod(Object object, String methodName, Object[] originalArguments);方法。注意把script脚本类注入进来,拿到binding对象;本方法体内先查找binding内的方法如果有话直接反射调,否则调父类的this.invokeMethod(theClass, object, methodName, args, false, false);

写了一段java代码,纯函数调用和常见的字符串操作,没有任何对外调用,数据是

© 著作权归作者所有

星仔小号
粉丝 14
博文 18
码字总数 16581
作品 0
高级程序员
私信 提问
Groovy,革命尚未成功,同志仍需努力。

公司要搞一个员工之间的技术交流,每个人准备一个关注的课题。 本喵,打算准备的课题是:jvm上的几种script语言实现。 Ruby、Python、Scala、Groovy等。 于是今天对Groovy做了几个简单的性能...

爱喝貓的咖啡
2014/03/12
140
0
Groovy 2.0 新特性之:静态类型检查

Groovy 2.0 刚刚发布,其中一项最大的改进就是支持静态类型检查。今天我们将对这个新特性进行全方位的介绍。 静态类型检查 Groovy 天生就是一个动态编程语言,它经常被当作是 Java 脚本语言,...

王振威
2012/11/27
1K
1
Groovy 1.8.2 和 1.9 beta3 发布

Groovy 团队刚刚发布了 Groovy 1.8.2 和 1.9-beta-3 两版本. 这两个版本最大的改进就是完成了原始类型算术的性能优化,另外还包括 bug 的修复。 发行说明:http://jira.codehaus.org/secure...

红薯
2011/09/06
333
2
Web应用工具箱 - Ratpack

Ratpack 是一个用于创建高性能Web应用的简单和能干的工具箱。 Ratpack 基于Java和 Netty 事件驱动网络引擎。Ta的API为 Groovy 和 Java 8做过优化,当然 Java 7 也可以使用。 这里是一个简单的...

匿名
2014/03/19
1K
0
CSDN日报20170727——《想提高团队技术,来试试这个套路!》

程序人生 | 想提高团队技术,来试试这个套路! 作者:劼哥stone 我加入阿里影业 3 个月,成功转为正式员工。新的开始,leader 给我新的要求,让我给组里的同学们带带节奏,帮助大家提高技术水...

blogdevteam
2017/07/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

新建时隐藏按钮,显示明细时显示

在InitControl()中 if (saTableKeys != null) { rpgDesign.Visible = true; rpgPrint.Visible = true; }......

_Somuns
36分钟前
5
0
【实战演练,拒绝996】-SpringBoot2.x自定义Spring boot Starter

欢迎关注 提升能力,涨薪可待 面试知识,工作可待 实战演练,拒绝996 如果此文对你有帮助、喜欢的话,那就点个赞呗! 前言 是不是感觉在工作上难于晋升了呢? 是不是感觉找工作面试是那么难呢...

ccww_
38分钟前
10
0
SpringBoot从入门到放弃,原理篇-自动配置原理

SpringBoot从入门到放弃,原理篇-自动配置原理 springboot自动配置原理 配置文件能配置的属性参照 自动配置原理 1、springboot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfig...

有一个小阿飞
今天
11
0
php变量和数据类型

php中的变量 PHP中的变量声明 PHP中的变量的使用 PHP中的数据类型之整型 PHP数据类型之浮点类型和布尔类型 PHP数据类型之字符串类型 PHP数据类型之heredoc和nowdoc的使用 PHP数据类型之复合类...

达达前端小酒馆
今天
7
0
OSChina 周日乱弹 —— 沙发忽然就爆炸了,吓死我了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】@这次装个文艺青年吧:#今日歌曲推荐# 分享Vicetone/Youngblood Hawke的单曲《Landslide》: 《Landslide》- Vicetone/Youngblood Hawke 手机党...

小小编辑
今天
253
10

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部