2008-05-03
Groovy 1.6-beta-1发布,性能有大幅提高!
感谢G2One和Groovy开发团队为我们发布了Groovy 1.6的第一个beta版本
除了73 个bug fixes和24个improvements之外,剩下的全部是关于性能的提升了 :)
运行和编译性能的提高
正如你在Groovy 1.5.5所体验到的,其编译速度较以前版本有了3 到5 倍的提高,编译速度的提升对于开发版本(1.6)和稳定版本(1.5.x分支)都是有效的,这要得益于类查找缓存(class lookup caches)技术,因此你的工程越大,这种编译速度就表现的越明显。
对于此次发布,最值得关注的变化还是Groovy运行时性能速度的提升,我们使用了Great Language Shootout的几个benchmarks来进行测试,相比于Groovy1.5.6的稳定版来说,性能有150%到460%的提高。尽管Micro-benchmarks测试不会反映出你工程中用到的各种代码,但是总的来说你工程的性能将有显著的提升。
除了交付稳定和高质量的发布之外,在过去的10个月中,我们的重心一直都在性能上面。在Groovy1.0和1.5.1之间,同样的测试内容,我们可以获得 80%的性能提升,即使是1.5.1和1.5.6这样的小版本之间,我们在性能方面又有40%的提升。但直到最近在当前的开发分支当中,我们才集成了现场缓存(site caching)和字节码瘦身(bytecode diets)技术,才会有上面提到的150-460%性能的提升。
重要新特性
除了性能提升、bug修复和小幅提升之外,让我们关注一下正在开发的两个新的关键特性。
多元赋值(Multiple assignments)
首先要谈的是multiple assignments。
一码(代码)胜万语 :)
抽象语法树转换(Abstract Syntax Tree-AST Transformations)
另一关键特性就是抽象语法树转换了,此高级特性对于了解Groovy内部机理的人来说尤为有用,不过Swing的开发者可能也会对此转换特性有极大兴趣。
在Groovy的编译器编译Groovy脚本和类的同时,源代码将先在内存中形成一个具体语法树(Concrete Syntax Tree),然后再转换成为抽象语法树。此AST转换的目的是让开发者可以参与到编译过程中,并且在转变为JVM可以运行的字节码之前可以修改这个AST。通过使用annotations来修饰某些类、字段或者方法,AST转换就可以应用于这些被修饰的元素。
AST转换的一个具体的示例是使用一个新的annotation:@Bindable,这在你开发Swing的时候,尤其有用,看如下示例:
当你使用@Bindable来修饰一个字段的时候,属性改变监听接口方法将被透明的加入到类的字节码中,因此现在你不需要手工编写这些方法,就可以监视此字段值的变化了,再也没有必要创建addPropertyListener()和removePropertyListener()方法来手工触发属性变化事件了。
Danno Ferrin在他的blog中给了我们一个使用此annotation的一个概览。
其他有用的转换和annotations在不久的将来也会出现。
Annotation的定义
最后但并非最不重要,正如以上所提到的,Groovy 1.5对使用Groovy创建annotations的支持依然很弱-- annotations依然需要用Java编写。现在你可以用一般的Java语法在Groovy中定义annotations。
值得注意的摘要
Groovy 1.6-beta-1是基于JDK 5构建的,但是我们还是提高了JDK 1.4的"retro-translated"版本。
不过要注意的是当运行在JDK 1.4的时候,你可能体验不到以上所说的性能的大幅提升,因为某些提升是依赖于JDK 5的某些特性 (比如util.concurrent VM 的优化)。
除了annotations, enums and generics.外,Groovy编译器生成的字节码依然是1.4的JVM字节码
有用的链接
最新beta下载:
http://groovy.codehaus.org/Download
Release notes from JIRA here:
http://jira.codehaus.org/secure/ReleaseNote.jspa?projectId=10242&styleName=Html&version=14008
总结
在此要感谢很多人,包括users, contributors, committers, G2One员工,没有你们的辛勤劳作,就没有此次新版本的革新和提高
还有特别感谢Paul King, Danno Ferrin, Alex Tkachman and Jochen "blackdrag" Theodorou,他们提供了高质量的代码。
除了73 个bug fixes和24个improvements之外,剩下的全部是关于性能的提升了 :)
运行和编译性能的提高
正如你在Groovy 1.5.5所体验到的,其编译速度较以前版本有了3 到5 倍的提高,编译速度的提升对于开发版本(1.6)和稳定版本(1.5.x分支)都是有效的,这要得益于类查找缓存(class lookup caches)技术,因此你的工程越大,这种编译速度就表现的越明显。
对于此次发布,最值得关注的变化还是Groovy运行时性能速度的提升,我们使用了Great Language Shootout的几个benchmarks来进行测试,相比于Groovy1.5.6的稳定版来说,性能有150%到460%的提高。尽管Micro-benchmarks测试不会反映出你工程中用到的各种代码,但是总的来说你工程的性能将有显著的提升。
除了交付稳定和高质量的发布之外,在过去的10个月中,我们的重心一直都在性能上面。在Groovy1.0和1.5.1之间,同样的测试内容,我们可以获得 80%的性能提升,即使是1.5.1和1.5.6这样的小版本之间,我们在性能方面又有40%的提升。但直到最近在当前的开发分支当中,我们才集成了现场缓存(site caching)和字节码瘦身(bytecode diets)技术,才会有上面提到的150-460%性能的提升。
重要新特性
除了性能提升、bug修复和小幅提升之外,让我们关注一下正在开发的两个新的关键特性。
多元赋值(Multiple assignments)
首先要谈的是multiple assignments。
一码(代码)胜万语 :)
def listOfN(numOfElem) \{ 1..numOfElem \}
def a, b
// variables will contain each successive element of the list
// and variables beyond the count of elements will be null
[a, b] = listOfN(1) // a list of one element
assert a == 1
assert b == null
// if there are more elements, they won't be assigned to any variable
[a, b] = listOfN(10) // a list of ten elements
assert a == 1
assert b == 2
// and you can swap variables with this notation
[a, b] = [b, a]
assert a == 2
assert b == 1
抽象语法树转换(Abstract Syntax Tree-AST Transformations)
另一关键特性就是抽象语法树转换了,此高级特性对于了解Groovy内部机理的人来说尤为有用,不过Swing的开发者可能也会对此转换特性有极大兴趣。
在Groovy的编译器编译Groovy脚本和类的同时,源代码将先在内存中形成一个具体语法树(Concrete Syntax Tree),然后再转换成为抽象语法树。此AST转换的目的是让开发者可以参与到编译过程中,并且在转变为JVM可以运行的字节码之前可以修改这个AST。通过使用annotations来修饰某些类、字段或者方法,AST转换就可以应用于这些被修饰的元素。
AST转换的一个具体的示例是使用一个新的annotation:@Bindable,这在你开发Swing的时候,尤其有用,看如下示例:
class MyBean {
@Bindable String pro
}
当你使用@Bindable来修饰一个字段的时候,属性改变监听接口方法将被透明的加入到类的字节码中,因此现在你不需要手工编写这些方法,就可以监视此字段值的变化了,再也没有必要创建addPropertyListener()和removePropertyListener()方法来手工触发属性变化事件了。
Danno Ferrin在他的blog中给了我们一个使用此annotation的一个概览。
其他有用的转换和annotations在不久的将来也会出现。
Annotation的定义
最后但并非最不重要,正如以上所提到的,Groovy 1.5对使用Groovy创建annotations的支持依然很弱-- annotations依然需要用Java编写。现在你可以用一般的Java语法在Groovy中定义annotations。
值得注意的摘要
Groovy 1.6-beta-1是基于JDK 5构建的,但是我们还是提高了JDK 1.4的"retro-translated"版本。
不过要注意的是当运行在JDK 1.4的时候,你可能体验不到以上所说的性能的大幅提升,因为某些提升是依赖于JDK 5的某些特性 (比如util.concurrent VM 的优化)。
除了annotations, enums and generics.外,Groovy编译器生成的字节码依然是1.4的JVM字节码
有用的链接
最新beta下载:
http://groovy.codehaus.org/Download
Release notes from JIRA here:
http://jira.codehaus.org/secure/ReleaseNote.jspa?projectId=10242&styleName=Html&version=14008
总结
在此要感谢很多人,包括users, contributors, committers, G2One员工,没有你们的辛勤劳作,就没有此次新版本的革新和提高
还有特别感谢Paul King, Danno Ferrin, Alex Tkachman and Jochen "blackdrag" Theodorou,他们提供了高质量的代码。
- 14:57
- 浏览 (491)
- 评论 (5)
- 分类: groovy/grails
- 发布在 Groovy on Grails 圈子
- 相关推荐
评论
agile_boy
2008-06-27
def f = gsh.find('.', '-name', '*.java', '-ls');
官方的例子,看对你有用么额
此外,那些shell命令跟Os也相关的吧
官方的例子,看对你有用么额
此外,那些shell命令跟Os也相关的吧
groovyzhou
2008-06-27
多谢了!
不过在groosh里面似乎不能使用通配符
def gsh = new groosh.Groosh();
gsh.ls("*.txt") //Error
print "ls *.txt".execute().text //这样也不行
这个问题该怎么解决啊
不过在groosh里面似乎不能使用通配符
def gsh = new groosh.Groosh();
gsh.ls("*.txt") //Error
print "ls *.txt".execute().text //这样也不行
这个问题该怎么解决啊
groovyzhou
2008-05-24
请教一个问题, 关于在groovy里调用外部命令的问题
在perl里面 通过 system "ls"
就可以直接运行ls命令
在groovy里面好像是 "ls".execute()
但是这样返回的是一个Process,而不是像perl那样直接把结果输出到屏幕
为了看到结果,我是这么做的 "ls".execute().in.eachLine { println it }
不知道有什么简便的方法没有
多谢了!
在perl里面 通过 system "ls"
就可以直接运行ls命令
在groovy里面好像是 "ls".execute()
但是这样返回的是一个Process,而不是像perl那样直接把结果输出到屏幕
为了看到结果,我是这么做的 "ls".execute().in.eachLine { println it }
不知道有什么简便的方法没有
多谢了!
山风小子
2008-05-03
Groovy1.6beta1的发布着实让人兴奋不已!
发表评论
- 浏览: 79636 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
我的相册
藏民生活体验(做糌粑)
共 5 张
共 5 张
链接
最新评论
-
Groovy 1.6-beta-1发布, ...
def f = gsh.find('.', '-name', '*.java', ...
-- by agile_boy -
Groovy 1.6-beta-1发布, ...
多谢了! 不过在groosh里面似乎不能使用通配符 def gsh = new ...
-- by groovyzhou -
Grails 1.0.3发布
to cauxu 如果要深入了解,还是有必要去了解一下Spring和Hibern ...
-- by agile_boy -
Grails 1.0.3发布
使用Grails 需要熟悉Spring hibernate么?
-- by cauxu -
Grails 1.0.3发布
究竟grails 1.1还发不发呀!我最近都偃旗息鼓,学django去了!感觉g ...
-- by zengsun






评论排行榜