Groovy 学习笔记3 运行效率

博客对Groovy、Java和JavaScript的运行速度进行了对比试验。结果显示,Groovy运行速度较慢,与Java相差10 - 30倍左右,而JavaScript比Groovy快5倍以上。反编译Groovy生成的class文件发现其代码效率低。

第一篇笔记里面,我说groovy运行的居然还满快的,其实是个误会了。我上次做八皇后还是在8080上面用basic做的,和现在奔四上面的groovy相比是没有意义的。特地又做了个对比试验:

1intq=9
2int[]i=newint[q]
3intcount=0
4longt=System.currentTimeMillis();
5scan(0)
6println("totleresults:"+count)
7println("totletime:"+(System.currentTimeMillis()-t));
8defscan(n){
9if(n==q){
10println(i.toList())
11count++
12return
13}

14i[n]=0
15while(i[n]<q){
16i[n]=i[n]+1
17if(check(n))
18scan(n+1)
19}

20}

21defcheck(n){
22if(n>0)
23for(jin0..<n)
24if(i[j]==i[n]||i[j]-i[n]==j-n||i[j]-i[n]==n-j)
25returnfalse
26returntrue
27}


运行结果是:totle time:7271 (为了用groovy控制台运行的,直接用groovy命令运行还要慢一点)

java呢?

queens.java:

1publicclassqueens{
2staticintq=9;
3staticint[]i=newint[q];
4staticintcount=0;
5publicstaticvoidmain(String[]args){
6longt=System.currentTimeMillis();
7scan(0);
8System.out.println("totleresults:"+count);
9System.out.println("totletime:"+(System.currentTimeMillis()-t));
10}

11privatestaticvoidscan(intn){
12if(n==q){
13for(intk=0;k<q;k++)System.out.print(i[k]+(k==q-1?"\n":","));
14count++;
15return;
16}

17i[n]=0;
18while(i[n]<q){
19i[n]=i[n]+1;
20if(check(n)){
21scan(n+1);
22}

23}

24}

25privatestaticbooleancheck(intn){
26for(intj=0;j<n;j++){
27if(i[j]==i[n]||i[j]-i[n]==j-n||i[j]-i[n]==n-j){
28returnfalse;
29}

30}

31returntrue;
32}

33}

34

运行结果是:totle time:271




每次运行花费的时间略有不同,groovy和java的运行速度看来大致相差10~30倍左右。


能说这是脚本语言天生的缺陷吗?我们来看看同样是类似java语法的脚本语言javascript在IE里面的速度:

1varq=9
2vari=[]
3varcount=0
4vard=newDate();
5scan(0)
6document.write("totleresults:"+count+"<br>")
7document.write("timeused:"+(newDate()-d)+"<br>")
8
9functionscan(n){
10if(n==q){
11document.write(i+"<br>")
12count++
13return
14}

15i[n]=0
16while(i[n]<q){
17i[n]=i[n]+1
18if(check(n)){
19scan(n+1)
20}

21}

22}

23
24functioncheck(n){
25for(varj=0;j<n;j++)
26if(i[j]==i[n]||i[j]-i[n]==j-n||i[j]-i[n]==n-j)
27returnfalse
28returntrue
29}






运行结果是: time used:1241
比groovy快了5倍以上。groovy可真是够慢的。


把groovy编译的class文件反编译了一下,看到groovy生成的代码效率确实是太低了,我们就看循环最内层的check函数吧:


1defcheck(n){
2if(n>0)
3for(jin0..<n)
4if(i[j]==i[n]||i[j]-i[n]==j-n||i[j]-i[n]==n-j)
5returnfalse
6returntrue
7}



编译后变成



1publicObjectcheck(Objectobj)
2{
3if(ScriptBytecodeAdapter.compareGreaterThan(obj,newInteger(0)))
4{
5Objectobj1=null;
6for(Iteratoriterator=ScriptBytecodeAdapter.asIterator(ScriptBytecodeAdapter.createRange(newInteger(0),obj,false));iterator.hasNext();)
7{
8Objectobj2=iterator.next();
9Objectobj3=null;
10if(ScriptBytecodeAdapter.asBool(ScriptBytecodeAdapter.asBool(ScriptBytecodeAdapter.compareEqual(ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this,"i"),"getAt",((Object)(newObject[]{
11obj2
12}
))),ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this,"i"),"getAt",((Object)(newObject[]{
13obj
14}
))))||ScriptBytecodeAdapter.compareEqual(ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this,"i"),"getAt",((Object)(newObject[]{
15obj2
16}
))),"minus",((Object)(newObject[]{
17ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this,"i"),"getAt",((Object)(newObject[]{
18obj
19}
)))
20}
))),ScriptBytecodeAdapter.invokeMethod(obj2,"minus",((Object)(newObject[]{
21obj
22}
))))?((Object)(Boolean.TRUE)):((Object)(Boolean.FALSE)))||ScriptBytecodeAdapter.compareEqual(ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this,"i"),"getAt",((Object)(newObject[]{
23obj2
24}
))),"minus",((Object)(newObject[]{
25ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this,"i"),"getAt",((Object)(newObject[]{
26obj
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值