`
ihuashao
  • 浏览: 4551381 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Groovy 学习笔记3 运行效率

阅读更多

第一篇笔记里面,我说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
color: #008080
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics