Groovy 学习笔记3 运行效率

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

 

 1

int  q = 9
 2

int [] i = new   int [q]
 3

int  count = 0
 4

long  t  =  System.currentTimeMillis();
 5

scan(
0 )
 6

println(
" totle results: " + count)
 7

println(
" totle time: " + (System.currentTimeMillis() - t));
 8

def scan(n)
{
 9

    
if (n==q){
10

        println(i.toList())
11

        count
++
12

        
return
13

    }

14

    i[n]
=0
15

    
while(i[n]<q){
16

        i[n] 
= i[n]+1
17

        
if (check(n))
18

            scan(n
+1)
19

    }

20

}

21

def check(n)
{
22

    
if (n>0)
23

        
for (j in 0..<n) 
24

            
if (i[j]==i[n] || i[j]-i[n]==j-|| i[j]-i[n]==n-j )
25

                
return false
26

    
return true
27

}


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

java呢?

queens.java:

 

 1

public   class  queens  {
 2

    
static int q=9;
 3

    
static int[] i=new int[q];
 4

    
static int count=0;
 5

    
public static void main(String[] args){
 6

        
long t = System.currentTimeMillis();
 7

        scan(
0);
 8

        System.
out.println("totle results:"+count);
 9

        System.
out.println("totle time:"+(System.currentTimeMillis()-t));
10

    }

11

    
private static void scan(int n){
12

        
if (n==q){
13

            
for (int k=0;k<q;k++) System.out.print(i[k]+(k==q-1?"/n":","));
14

            count
++;
15

            
return;
16

        }

17

        i[n]
=0;
18

        
while(i[n]<q){
19

            i[n] 
= i[n]+1;
20

            
if (check(n)){
21

                scan(n
+1);
22

            }

23

        }

24

    }

25

    
private static boolean check(int n){
26

        
for(int j=0;j<n;j++){
27

            
if (i[j]==i[n] || i[j]-i[n]==j-|| i[j]-i[n]==n-j ){
28

                
return false;
29

            }

30

        }

31

        
return true;
32

    }

33

}

34

运行结果是:totle time:271




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


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

 1

var q = 9  
 2

var i
= [] 
 3

var count
= 0  
 4

var d 
=   new  Date(); 
 5

scan(
0
 6

document.write(
" totle results: " + count + " <br> "
 7

document.write(
" time used: " + ( new  Date() - d) + " <br> "
 8


 9

function scan(n)

10

    
if (n==q)
11

        document.write(i
+"<br>"
12

        count
++ 
13

        
return 
14

    }
 
15

    i[n]
=0 
16

    
while(i[n]<q){
17

        i[n] 
= i[n]+1 
18

        
if (check(n)){
19

            scan(n
+1
20

        }
 
21

    }
 
22

}
 
23


24

function check(n)

25

    
for (var j=0; j<n;j++)
26

        
if (i[j]==i[n] || i[j]-i[n]==j-|| i[j]-i[n]==n-j )
27

            
return false  
28

    
return true 
29

}
 






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


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


1

def check(n) {
2

    
if (n>0)
3

        
for (j in 0..<n) 
4

            
if (i[j]==i[n] || i[j]-i[n]==j-|| i[j]-i[n]==n-j )
5

                
return false
6

    
return true
7

}


 


编译后变成



 1

     public  Object check(Object obj)
 2

    
{
 3

        
if(ScriptBytecodeAdapter.compareGreaterThan(obj, new Integer(0)))
 4

        
{
 5

            Object obj1 
= null;
 6

            
for(Iterator iterator = ScriptBytecodeAdapter.asIterator(ScriptBytecodeAdapter.createRange(new Integer(0), obj, false)); iterator.hasNext();)
 7

            
{
 8

                Object obj2 
= iterator.next();
 9

                Object obj3 
= null;
10

                
if(ScriptBytecodeAdapter.asBool(ScriptBytecodeAdapter.asBool(ScriptBytecodeAdapter.compareEqual(ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this"i"), "getAt", ((Object) (new Object[] {
11

    obj2
12

}
))), ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this, ((Object) (new Object[] {
13

    obj
14

}
)))) || ScriptBytecodeAdapter.compareEqual(ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this, ((Object) (new Object[] {
15

    obj2
16

}
))), "minus", ((Object) (new Object[] {
17

    ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(
this, ((Object) (new Object[] {
18

        obj
19

    }
)))
20

}
))), ScriptBytecodeAdapter.invokeMethod(obj2, ((Object) (new Object[] {
21

    obj
22

}
)))) ? ((Object) (Boolean.TRUE)) : ((Object) (Boolean.FALSE))) || ScriptBytecodeAdapter.compareEqual(ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(this, ((Object) (new Object[] {
23

    obj2
24

}
))), ((Object) (new Object[] {
25

    ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.getGroovyObjectProperty(
this, ((Object) (new Object[] {
26

        obj
27

    }
)))
28

}
))), ScriptBytecodeAdapter.invokeMethod(obj, ((Object) (new Object[] {
29

    obj2
30

}
)))) ? ((Object) (Boolean.TRUE)) : ((Object) (Boolean.FALSE))))
31

                    
return Boolean.FALSE;
32

            }

33


34

        }

35

        
return Boolean.TRUE;
36

    }

37




 

一切都是object,做任何事情都是invokeMethod,两个整数的比较居然要写将近400个字符的代码,光看代码量都可以吓倒我了。这是我们期待的脚本语言吗?


groovy可以嵌入到java代码里面,但是java代码可以嵌入到groovy里面吗?我觉得groovy有必要提供这样一种机制,在有必要的时候可以消除性能瓶颈。可是现在只看到groovy里面可以通过Scriptom(现在还是beta版)嵌入vbs、js脚本(包括使用WSH,FSO)或者调用InternetExplorer、Media Player、Word和Excel等windows组件。看来对消除性能瓶颈的帮助不大。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


背景:    8月29日,凌晨4点左右,某服务告警,其中一个节点直接down掉,收到告警的同事让运维重启。    9点左右,内存监控上发现内存异常,堆内存涨速很快,即便GC也没有什么效果,频繁GC。    9点38,服务各种超时,影响整个app使用。处理方式:    当时由于很想要
https://support.smartbear.comeadyapi/docs/soapui/steps/groovy.htmlGettestcaseobjectToobtaintheobjectwhichreferstothecontainingtestcase,usethefollowingcodesnippet:Groovy def case=testRunner.testCase; Byusingthe tes
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能。查看最流行的扩展机制,比较性能并分析哪一个是最好的。  这是乐队之战,JMeter风格。 BeanshellV.JSR223V.JavaRequestSampler 在我们之前的帖子中,  JMeterPerformance和TuningTips  ( 由fantastik
Scala和Java为静态语言,Groovy为动态语言Scala:函数式编程,同时支持面向对象Groovy:jvm上的脚本,较好兼容java语法,Groovy加强了Java集成。 可配置化的优势,可以将一些简单的逻辑公开给外部编辑和使用,增强了互操作性,复杂逻辑来说,可配置化代码的调试则会比较麻烦 Scala和Java
出处:https://www.jianshu.com/p/ce6f8a1f66f4一、一些内部元件的访问testRunner.testCase开头1、向下访问testRunner.testCase.testSteps[testStepName]testRunner.testCase.getTestStepByName("新增一个空间")2、向上访问,用于访问同一项目中的其他testSuites和testCase下
在运行groovy的junit方法时,报了这个错误:java.lang.ExceptionInInitializerError atorg.codehaus.groovy.reflection.ClassInfo.isValidWeakMetaClass(ClassInfo.java:271) atorg.codehaus.groovy.reflection.ClassInfo.getMetaClassForClass(ClassInfo.java:241) atorg.codeha
基本语法1.Grovvy的注释分为//和/**/和java的一样.2.Grovvy语法可以不已分号结尾.3.单引号,里面的内容严格的对应java中的String,不对$符号进行转义.defs1='iamastudent$'printlns1iamastudent$4.双引号“”的内容中如果有$号的话,会先对表达式先求值.de
Tiobe发布了最新一期(3月份)编程语言欢迎度榜单,其榜单根据互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube统计出排名数据。TOP5几乎没有变化,Java和C语言牢牢占据前两名。Python相较去年上升一位进入TOP3,C++下
我有一个Google地图组件,作者可以在其中指定纬度和经度.我正在使用带有正则表达式的常规“输入”类型控件来验证它们是否是数字,但是,当试图解决指定范围的问题时(经度验证该值在[-180,180]内并且纬度[-90,90])但是,通过正则表达式进行验证似乎很麻烦,而且利用inputtype=“numb
我正在为未来的应用程序评估SpringBoot,并希望使用Groovy模板来实现其纯粹的可读性.不幸的是,我在迭代我添加到控制器返回的ModelAndView对象的对象列表时遇到了麻烦.这是我的控制器:@RestController@RequestMapping("/ships")publicclassShipsController{@Autowired
我有一个基于Spring的java应用程序,其中包含一些有用的组件.作为系统的一部分,我有一个groovy脚本,来处理一些报告.我想从groovy脚本中调用spring组件.当我用Java编写时,我需要在@Component中使用@Autowired注释,即@ComponentclassReporter{@AutowiredSearchServicesearchS
在Grailsi18n插件definedthusly中定义了一个messageSourcebean:messageSource(PluginAwareResourceBundleMessageSource){basenames=baseNames.toArray()fallbackToSystemLocale=falsepluginManager=manager....}是否可以覆盖我的resources.groovy中的fa
我正在寻找一种方法来反向工程RDBMS表(MSSQLServer)并生成JPA@EntityGroovy类.我们目前没有选择使用Grails和/或GORM,因此Grailsdb-reverse-engineer插件似乎很接近但不太正确.它生成符合GORM的类而不是JPA实体类.我们目前有一个gradle构建,它利用org.hibernate.tool.ant.Hibe
https://blog.csdn.net/Gdeer/article/details/83062523一、直接运行groovy程序因为groovy插件和android插件不兼容,所以不能在原始项目上使用groovy。 新建module,创一个JavaLibrary,取名lib。  修改lib/build.gradleapplyplugin:'java-library'depe
一、自动生成GET请求脚本1、配置Createascript在ngrinder管理台主页,点击script–>Createascript,并填写脚本名称和请求的url,如下所示:点击Create按钮,nGrinder会自动生成对应的脚本结构,如果没有参数需要设置的话,可以直接运行了。二、详细解析GET请求脚本ngrinder自动生成的脚本
我正在关注使用列表和地图作为构造函数的this博文.为什么以下列表无法强制反对?classTest{staticclassTestObject{privateinta=1;protectedintb=2;publicintc=3;intd=4;Strings="s";}stati
Information:java:Errorsoccurredwhilecompilingmodule'security'Information:javac1.8.0_131wasusedtocompilejavasourcesInformation:2019/6/98:31-Buildcompletedwith1errorand0warningsin3s116msError:java:读取E:\repository\org
ngrinder中的groovy脚本结构类似junit,同时在junit的基础之上封装了自己的注解,用来控制脚本的运行。一、运行逻辑图如下:此处只列出了groovy脚本的逻辑,jython脚本是类似的,在此不再单独介绍。二、各注解的使用比较三、关注点在ngrinder中,通常使用单进程多线程就足够大部分测试了,所以:
我有一个switch语句来处理javaenumfoo,并使用spock编写一些groovy单元测试.我已经添加了一个测试,它验证当前是否处理了每种类型的foo而没有抛出异常.现在我想测试一个无法识别的foo类型会导致抛出异常.要做到这一点,我将不得不嘲笑枚举,并已经看到这里概述的解决方案:MockingJ
我有一个groovy实体ClientInvoiceAttachmentExt,它扩展了java实体ClientInvoiceAttachment.ClientInvoiceAttachment具有@Id注释,但仍然看到“没有为实体指定的标识符”错误这是我的堆栈跟踪[Mar0317:11:54]ERROR|org.springframework.web.context.ContextLoader|Contex