第一篇笔记里面,我说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
分享到:
相关推荐
Groovy 学习笔记 Groovy 学习笔记
Groovy
Groovy学习笔记,内容如下: 1.概念 2.基本语法 3.字符串 4.集合 5.类和闭包 6.控制语句 7.操作符重载 8.I/O操作 9.高级应用 10.正则表达式
对Groovy开发环境设置,基本语法做了简单明了的介绍
图文并茂,适合入门新手,涵盖了基本的语法讲解及一些DEMO测试,值得一看
Groovy语法&Gradle配置学习笔记
NULL 博文链接:https://rsljdkt.iteye.com/blog/859059
Groovy_笔记
第1章 数字和字符串 第2章 List的简单介绍 第3章 String的特殊用法 第4章 闭包 第5章 集合+闭包 第6章 Map和Range 第7章 函数
Grails Groovy 学习必备参考资料
很好的学习Groovy的学习资料, 很实用。。 个人感觉Groovy是Java敏捷开发的首选。
Groovy学习资料-中文.rar。Groovy学习资料。Grails学习资料。mht网页格式。
适合想了解groovy 编程开发的人员 Groovy - hellworld Groovy - 变量 Groovy - 静态import Groovy - 字符串 Groovy - 分支结构语句 Groovy - 循环结构语句
groovy学习大礼包,包括groovy用户指南,groovy解惑,Groovy轻松入门
网络红文 实战gradle,android,java开发人员的必修课
groovy 敏捷 开发 动态 语言 急速 web 应用 开发
NULL 博文链接:https://xiajs.iteye.com/blog/1871551
groovy包及相关学习资料,里面包含所有groovy所需要使用的包,还有一些有关这个的用法。
Learning Groovy 3