`
liangshixing
  • 浏览: 11057 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

今天做了个小实验,关于Groovy性能

阅读更多
//使用groovy的语法去编写
long time = System.currentTimeMillis()
10000.times {
int i = 0;
1000.times{ val->
i += val
}
}
println "${System.currentTimeMillis() - time} ms"

//使用Java的语法去编写
time = System.currentTimeMillis();
int i = 0;
for(int x= 1;x<10000;x++) {
for(int y=1;y<1000;y++)  {
i=i+y;
}
}
System.out.println(i + " " + (System.currentTimeMillis() - time) +" ms");

执行结果分别是:
700032704 14531 ms
700032704 15875 ms

而第二部分代码写在Java类中的执行结果是:
700032704 16 ms


能基本说明两个问题,一,在Groovy中使用Java的语法,不会带来性能上的提升;二,Groovy在运行性能上和Java还是有较大差距的。

同样的逻辑,使用Ruby1.9,执行时间为3578.0 ms。

这样的结果我不甘心,于是,我在Groovy中调用了Java的代码:
time = System.currentTimeMillis()
JavaTest.main(null);
println "${System.currentTimeMillis() - time} ms"

执行结果还是700032704 16 ms。呵呵,看来如果需要进行大数据量的运算,还是先写到Java中吧,好在Groovy可以直接调用Java的代码。
分享到:
评论
19 楼 helian 2008-05-08  
测试了一下各种循环,发现for in是最快的。
18 楼 cfly 2008-01-13  
对“拿int的计算来证明语言的计算能力”这种行为表示质疑。
17 楼 魔力猫咪 2008-01-12  
其实我最初是看到他的测试不太科学,说让他看看Grails网站做的Grails和rails的对比测试。虽然是Grails自己做的,但是既然敢放出来,那么就多少有些可信。结果被骂了(那个帖子已经被删了),就在自己的机器上重复了他的测试。以此证明他的测试误差比较大,如果用来做严谨的性能测试,无法得到正确结果。而且选择的测试用例也不太合适。结果他反以为我要证明Groovy和Java速度一样。结果就这么吵了下来。
16 楼 fangzhouxing 2008-01-11  
http://www.nabble.com/groovy-is-slow-to14502299.html
15 楼 Eric_liu 2008-01-11  
tedeyang 写道
看两位在争吵,我唯一的收获就是知道了还有p-unit这东西。
谢谢,
一般我在性能测试的时候也是用System.currentTimeMillis()来做的。
我觉得误差问题也不会太大。

Groovy在数值计算上的速度确实太低了,JavaScript要远远比它快。
不过这样猛烈的数值计算一般用不到,还好,呵呵。


我和这位老兄一样.知道了p-unit这么好玩好用的一个东西.哈哈
14 楼 tedeyang 2008-01-10  
看两位在争吵,我唯一的收获就是知道了还有p-unit这东西。
谢谢,
一般我在性能测试的时候也是用System.currentTimeMillis()来做的。
我觉得误差问题也不会太大。

Groovy在数值计算上的速度确实太低了,JavaScript要远远比它快。
不过这样猛烈的数值计算一般用不到,还好,呵呵。
13 楼 geszJava 2008-01-10  
groovy的简单值处理有待提高.至少需要到达rails这种程度.
不过数值运算就不需要用groovy来搞了吧.
有哪位可以检测一下其他方面得东东,譬如函数调用的性能.
12 楼 魔力猫咪 2008-01-04  
下面是我今天上午用p-unit性能测试引擎做的测试。测试结果应该是比较精确的。还是我那台机器,测试了四次。groovy是用groovyc编译成Java代码测试的。

Goo.groovy
int i=0
for (int x in 1..10000) {
    for (int y in 1..1000) {
        i+=y
    }
}


Joo.java
public class Joo {
	public void begin() {
		int i = 0; 
		for (int x = 1;x <= 10000;x++) { 
			for (int y = 1;y <= 1000;y++) { 
				i = i + y;
			}
		}
	}
}


TestClass.test
import groovy.lang.Script;
import org.punit.runner.SoloRunner;
public class TestClass {

	public void testGoo() {
		Script g = new Goo(); 
		g.run();
	}
	
	public void testJoo(){
		Joo j = new Joo();
		j.begin();
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		new SoloRunner().run(TestClass.class);
	}

}


下面是测试结果。
[solo] Starting TestClass
TestClass
testGoo() - [11809.302021ms]
testJoo() - [24.416232ms]
total: 2, failures:0 (GREEN) - 11868.730802ms

[solo] Starting TestClass
TestClass
testGoo() - [11783.037229ms]
testJoo() - [22.409552ms]
total: 2, failures:0 (GREEN) - 11840.076323ms

[solo] Starting TestClass
TestClass
testGoo() - [11668.793659ms]
testJoo() - [22.272384ms]
total: 2, failures:0 (GREEN) - 11727.853121ms

[solo] Starting TestClass
TestClass
testGoo() - [11584.613966ms]
testJoo() - [22.87693ms]
total: 2, failures:0 (GREEN) - 11643.096818ms

你可以看到两者的执行时间。testGoo测试的是groovy,testJoo测试的是Java。
11 楼 魔力猫咪 2008-01-04  
for(int x= 1;x<10000;x++) {
for(int y=1;y<1000;y++) {
我这么写,在Java里得到的数是6.....的。还是你代码错了。
其实我到底反对你哪里你也没搞明白。我主要反对的是你用这种方法做性能测试。用读取时间整型相减的方法测试是不科学的。像这种相差太大的测试,结论虽然不会错,但是得到的数据误差实在太大。我也说了,我做的时候,误差到了秒一级。
如果是在工作中,比较同一语言的两种算法的话,这种性能测试根本无法分辨性能差距。
我主要说的是这个问题。你虽然没有误导新手的意思,但是你的测试数据确实有肯能产生这种事情。所以说,性能测试不是随便写几个代码就出来的。
10 楼 liangshixing 2008-01-03  
更新了一下代码:
time = System.currentTimeMillis();
i = 0;
for(int x in  0..9999) {
for(int y in 0..999)  {
i+=y;
}
}
System.out.println(i + " " + (System.currentTimeMillis() - time) +" ms");
确实比原来要快一倍,但不管怎么说,在Groovy中使用Java进行运算,是绝对正确的!
你在说我不对的时候,也有不少错误。是x<=10000和y<=1000,算出来的结果不正确的,逻辑都搞不正确还谈什么测试性能。
Groovy存在的价值更多的体现在它与Java的亲密关系上。不管什么高手老鸟,都不会介意在Groovy中用Java吧?
我的测试本身也不是用于比较Groovy和Java,我想比的是Ruby。我想说既然直接比比不过,就请Java出面好了。这是被你一步一步引入误区的!
9 楼 魔力猫咪 2008-01-03  
用对象计算是行为艺术?那BigDecimal呢?精确浮点运算你不用这个,保证误差哭死你。
动态语言比静态语言在速度上有数量级的差距是肯定的,没有人能说不对。我从来也没打算要证明groovy比java快(这是不可能的)。
我主要说的是你测试的结果不正确。性能测试不是这么来做的。我用重复你测试的办法,主要是要说明你测试的方法不正确。
首先,这种测试没有意义,用groovy最差的地方去和java最快的地方做对比,有意义吗?熟悉动态语言和静态语言的人都知道,两者的差距至少要有1个以上的数量级(20倍算少的)。其次,你的时间取值方法的误差太大,我用你的取值方式,误差达到秒级;再次,因为你测试用例有问题,两者的差距远没有你测试的那么大,我的groovy按照标准写法,性能立刻提高一倍。
你这种测试除了吓跑没接触过groovy的新手,严重误导大家对groovy的看法外,没有任何作用。因为你测出来的速度差距实在是超级大。
初学者是很难分析这些性能测试到底有什么意义的,他们只知道groovy比java慢800多倍。
结果在适合使用groovy等动态语言的地方,有了这种先入为主意识的人也会拒绝动态语言,他们的理由就是,groovy比java慢800多倍。
8 楼 xyz20003 2008-01-03  
我的结论是复杂数值计算用汇编。:D
7 楼 liangshixing 2008-01-03  
你是想用对象类型去搞数值计算?行为艺术吗?
我的结论是,在进行复杂数值计算是用Java去写。20倍的差距还小啊?算推翻我结论啦?
6 楼 魔力猫咪 2008-01-02  
好。你说我不能动摇你的实验。那我就动摇一下。还就用你的代码。不过你这种计时方式确实不科学。误差太大,无法准确记录程序实际消耗的时间。

首先,我说明一下我的环境,省得说我欺负你。
老IBM T40笔记本一台。PM1.5G,512M内存,30G4500转硬盘,独立显卡。装XPSP2系统。groovy是1.5.1,Java是6.0 update3。Java的环境是Eclipse3.3。机器因为装了太多IBM附带工具和金山2008杀毒软件,启动后内存占用约350M,Eclipse启动后,占用约500M。
首先是你在groovy中的程序。
//使用groovy的语法去编写
long time = System.currentTimeMillis()
10000.times {
int i = 0;
1000.times{ val->
i += val
}
}
println "${System.currentTimeMillis() - time} ms"

//使用Java的语法去编写
time = System.currentTimeMillis();
int i = 0;
for(int x= 1;x<10000;x++) {
for(int y=1;y<1000;y++) {
i=i+y;
}
}
System.out.println(i + " " + (System.currentTimeMillis() - time) +" ms");
发现你java部分贴错了,是x<=10000和y<=1000。
这两个我的机器里执行,消耗在21000到23000ms之间。比你的慢,估计是机器的缘故。
但是,我发现你写得groovy循环不对,我没有在我找到的资料中发现你这种循环方法,所以我使用了标准的for循环。
long time = System.currentTimeMillis()
int i = 0;
for (int x in 1..10000 ) {
    for (int y in 1..1000) {
        i+=y;
    }
}
println "${i},${System.currentTimeMillis() - time} ms";
不知道你哪里找的循环方法,我这是groovy标准的for循环。
编译后执行,710032704,11577 ms,没什么浮动
控制台执行,710032704,12177 ms,1000ms左右浮动
所以说,你的循环代码有问题,我按标准的写法,速度快了一倍。

然后说Java的执行
Eclipse环境下,纯Java代码消耗20到30ms。把int和long换成Integer和Long,约610 ms。

看看你原来的代码,在我的环境下,21000/30 = 700倍速度。
我修改的代码,11577/30 = 385倍速度。
我觉得用基本类型和对象去拼比较无赖,所以测了一个对象的,用Integer和Long代替了int和long,11577/610=18.97倍。以动态语言对静态语言,差10倍20倍的速度,不能算慢吧?
也就是说,跑这个代码,groovy最少可以做到java20分之一的速度。当然,因为采用了你这种不科学的计算,我的误差很大。
你也可以看到,控制台执行的时候,最低21000多,最高到过23000。误差约2秒。这种测试都能有这么大误差。可见计时的不精确。
你这个测试是“以groovy之短攻java之所长”。动态语言对于这种计算是最慢的。因为要每计算一次都要判断类型等工作。所以花费时间很长。但是即使如此,我也可以做到最低20倍速度差。总比你14000多对16,差约875倍小。
5 楼 goodyang 2008-01-02  
接受不了意见发什么帖子,这里不是一言堂
4 楼 liangshixing 2008-01-01  
魔力猫咪 写道
可以肯定的是,Groovy绝对比Java要慢,而且要慢很多。不过有没有这里的差距,实在不好说。说实在的,这里没有写清楚Groovy的版本、Java的版本以及测试的环境。而且用System.currentTimeMillis()来取时间不可取。我曾经用这种方法实验过,无法实际反映花费的时间。

下面是国外的测试,比你的测试要好不少。你参考参考。
http://docs.codehaus.org/display/GRAILS/Grails+vs+Rails+Benchmark


看着好像你写了不少东西。实际上全是没用的费话,你动摇的了我的结论吗?我没写明白我这叫小实验吗?小样吧。
3 楼 魔力猫咪 2007-12-28  
可以肯定的是,Groovy绝对比Java要慢,而且要慢很多。不过有没有这里的差距,实在不好说。说实在的,这里没有写清楚Groovy的版本、Java的版本以及测试的环境。而且用System.currentTimeMillis()来取时间不可取。我曾经用这种方法实验过,无法实际反映花费的时间。

下面是国外的测试,比你的测试要好不少。你参考参考。
http://docs.codehaus.org/display/GRAILS/Grails+vs+Rails+Benchmark
2 楼 agile_boy 2007-12-28  
http://www.jroller.com/rants/entry/why_is_groovy_so_slow
其实关键要清楚自己的性能是在那里,Groovy并不是万能的灵丹妙药,关于why groovy is slow,在groovy的maillist也有讨论。
1 楼 lordhong 2007-12-27  
"进行大数据量的运算"当然是用JAVA或者C来写咯...
GROOVY要充分利用它DYNAMIC LANGUAGE的特性...发扬长处...

相关推荐

    java、groovy、C#、Javascript性能比较

    java、groovy、C#、Javascript的运行效率到底如何? 通过实验比较,Javascript的运行效率解决java,看来基于javascript的html5前途远大。 C#的Release版的运行性能也相当高,和C++相差不大,值得推荐。 文件内部...

    apache-groovy-sdk-3.0.8.zip

    Apache Groovy SDK 3.0.8 是一个用于开发Groovy应用程序的软件开发工具包,它为Java开发者提供了一个强大的动态编程语言环境。Groovy是一种基于JVM(Java Virtual Machine)的灵活、简洁且富有表现力的语言,它可以...

    Groovy Java Genetic Programming-开源

    Groovy Java Genetic Programming项目,是基于Java语言的强类型遗传编程实验平台,它提供了一个高效且灵活的框架,使得开发者能够方便地进行遗传编程实验,探索各种算法的可能性。 Groovy Java Genetic Programming...

    grails_nodejsApp:带有 nodejs 和 groovy on grails 的 Gumball Machine 应用程序

    这个应用程序可能是模拟自动售货机的系统,用于教学或实验目的,特别是针对CMPE281课程的实验4。 Groovy on Grails,是基于Java平台的开源Web应用框架,利用Groovy语言的简洁性和灵活性,提供模型-视图-控制器(MVC...

    等一分钟——Android项目构建性能优化抛砖引玉的副本.docx

    - **模块化**:将大型项目分解成多个独立的小模块,每个模块单独编译。 - **并行化**:通过多线程并发执行子任务来利用多核处理器的优势。 - **增量构建**:仅重新构建已更改或新增的部分,避免全量构建。 #### 三...

    Android 6.0 AS平台 JNI 实验

    Android 6.0 平台上使用Android Studio (AS) 进行JNI开发是一个常见的实践,JNI(Java Native Interface)允许Java代码与其他编程语言(如C++)进行交互,以利用其性能优势或调用特定库。这个实验将带你了解如何在...

    fladle,用于firebase测试实验室和侧翼的gradle插件.zip

    **Firebase测试实验室与Fladle简介** Firebase测试实验室是Google提供的一项云服务,旨在帮助开发者对Android应用程序进行自动化测试。它提供了多种设备和操作系统版本的虚拟环境,让开发者可以在实际设备和模拟器...

    gradle user

    创建一个简单的 Groovy 应用程序,并使用 Gradle 进行构建。 #### 七、网页应用快速入门 ##### 构建 WAR 文件 使用 Gradle 打包 Web 应用为 WAR 文件格式。 ##### 运行 Web 应用 在内置服务器或外部服务器上部署...

    autod-lab

    "自动实验室"(Autod-Lab)是一个基于Groovy编程语言构建的自动化实验平台,旨在为用户提供便捷的自动化测试和实验环境。Groovy是一种强大的、动态的、面向对象的脚本语言,它与Java平台紧密集成,使得在执行自动化...

    gradle4.5_my_temp

    标签 "gradle" 确定了主题,让我们知道讨论的核心是关于Gradle,一个基于Groovy和Kotlin的开源构建工具,它可以用于各种编程语言的项目,包括Java、Kotlin、Groovy等。 在压缩包的文件名称列表中,我们有两个文件:...

    gradle_java_experiments:各种gradle java实验的容器项目

    8. **性能优化**:实验可能涉及到内存管理、垃圾收集、代码优化等提升Java应用程序性能的策略。 通过这个"gradle_java_experiments"项目,开发者可以深入学习Gradle的配置和使用,以及如何在实际项目中利用Java的...

    Android Studio —— 下载网络图片显示

    Volley库由Google提供,它是一个高效的网络库,特别适合处理小数据量的网络请求,如图片下载。 1. **添加依赖**: 在`build.gradle(Module)`文件中,添加Volley库的依赖: ```groovy dependencies { implementation...

    JDK 11 API中文帮助文档.zip

    8. **ZGC:一个低延迟的垃圾收集器**:ZGC是一个实验性的垃圾收集器,其目标是在大内存环境中实现极低的暂停时间。虽然默认不开启,但可以在特定场景下进行配置使用。 9. **Java Flight Recorder(JFR)和Java ...

    Web应用开发课程设计-健康码管理系统.zip

    在信息技术飞速发展的今天,Web应用开发已经成为计算机科学中的一个重要领域。本项目“Web应用开发课程设计-健康码管理系统”旨在让学生掌握Web应用开发的基本技术和流程,通过实际操作提升其编程能力与项目管理技能...

    distributed-gradle:一个实验,看看在 HTTP 服务器上保存 Gradle 文件如何影响构建时间

    Gradle是一个基于Groovy的自动化构建工具,它使用声明式的方式来定义项目构建过程。在传统的Gradle构建过程中,项目依赖、插件和其他构建资源通常是从远程仓库(如Maven Central或JCenter)下载到本地磁盘的Gradle...

    gradle-4.3.1-all.zip

    这个版本的Gradle在2017年发布,带来了许多性能改进和新特性。 在Android Studio中,Gradle是默认的构建系统,它负责编译、打包和测试应用。Android Studio会自动管理Gradle版本,但有时开发者可能需要手动下载特定...

    IBM.zip IBM RAD资源包

    在提供的资源中,"脚本语言课件"可能包含了关于如何使用IBM RAD进行脚本语言开发的教程,如JavaScript或Groovy。这些课程通常会涵盖语法基础、函数、类库以及如何在IBM RAD环境中集成和调试脚本。 "配套的实验习题...

    JMeter压测时报内存不足故障的9个简单解决方案.docx

    ### JMeter压测时报“内存不足”故障的9个简单解决方案 #### 1. 增加Java堆大小 在进行JMeter压力测试时遇到`java.lang.OutOfMemoryError: Java heap space`这类错误是非常常见的问题。这通常意味着JMeter在运行...

    hibernate-metrics:Grails插件使用Hibernate Statistics API报告一些简单的应用程序性能指标

    Grails Hibernate Metrics插件Grails插件使用Hibernate Statistics API报告一些简单的应用程序性能指标。 该插件是在引入的-演示视频可在。 请注意,此插件尚处于初期阶段,应视为实验性的。 在这一点上,我建议仅将...

Global site tag (gtag.js) - Google Analytics