groovy 2.5.4_Java 7 vs Groovy 2.1性能比较

groovy 2.5.4

自从我与Grails上一次接触以来,我已经有两年没有使用Groovy了。 我陷入(硬)核心企业Java中,但在后台遇到了一些性能方面的问题。 我几乎错过了学习Spock的机会,但是幸运的是, 华沙Java用户组帮助我摆脱了一些旧系统,恢复了正常的自我开发。 实际上,我希望Spock或Geb之类的框架能够通过使它们更容易,更有效来改变编写测试的方法。 这两个框架都使用Groovy以及构建工具中的新国王– Gradle 。 看到Groovy的速度如何影响我们的日常工作,我决定仔细研究它的性能,并将其与Java 7进行比较。

我的测试环境基于Java 1.7.0_25和Groovy 2.1.6。 像往常一样,我在1.0-beta-1版本(几乎稳定)中使用了Caliper ,并准备了许多(我希望)具有代表性的微基准。

基于Fork / Join框架的第一个基准测试在两种语言中应该是最相似的,因为它使用了一些本机机制。 我的测试使用一些随机的int数据初始化了数组,然后使用框架在数组中找到最大的元素。 在Groovy中,我的计算函数如下所示:

@Override
Integer compute() {def size = end - startif (size == 1) {Math.max(array[start], array[end])} else {int diff = size / 2MaxValueSeeker left = new MaxValueSeeker(array, start, start + diff)left.fork()MaxValueSeeker right = new MaxValueSeeker(array, start + diff, end)Math.max(right.compute(), left.join())}
}

Java版本当然非常相似。 经过十几分钟的测量,我得到了非常可观的结果:Groovy仅慢了8倍。

现在是时候在日常开发中检查一些更现实的时候了。 为了确保JIT不会消除我的代码(我相信他喜欢做这样的笑话),我选择了简单的POJO / POGO(是的),并进行了一些简单的操作。 我在groovy中的伪“业务逻辑”方法:

def int proceed(int reps) {List<GroovyPojo> list = new ArrayList<>()int sum = 0;reps.times {// first param is int and second is Stringlist.add(new GroovyPojo(value: it, stringValue: it))}list.each {if (Integer.parseInt(it.stringValue) == it.value) {sum += it.value}}sum
}

Java版本的主要区别在于POJO构造函数中的getter和手动String boxing。 在阅读新闻上又花了十几分钟的时间……这次,Groovy仅慢了7倍

最后的测试应具有压力,并在更复杂的计算中检查两种语言。 我下定决心,选择了快速排序算法。 循环很少,如果if语句不起作用。 我不会在这里复制粘贴它,因为这是众所周知的解决方案。 值得一提的是计时结果,几乎是Groovy的5倍! 但是我已经进行了一些谷歌搜索,并注意到Groovy 2.0引入了@CompileStatic批注,这应该给我们带来一些额外的性能提升。 因此,让我们检查一下……是的,通过静态编译,Java的优势下降到了220%。

在下表中,您可以找到详细的结果。 总结一下–我不确定在关键任务功能中使用Groovy是个好主意,但绝对是实现测试,原型设计等的绝佳解决方案。让我强调一下,在Caliovy中编写Caliper的结果解析器大约需要6行(解析json,迭代测量并计算平均值)

性能比较

方法 Java [ns] Groovy [ns] 因子
叉/连接 22.132 181.018 8.18
波霍斯 117.914 856.337 7.26
快速排序 68.728 330.159 4.80
使用@CompileStatic的Quicksort 67.752 147.792 2.18

参考:来自Java(B)Log博客的JCG合作伙伴 Jakub Kubrynski的Java 7 vs Groovy 2.1性能比较 。

翻译自: https://www.javacodegeeks.com/2013/09/java-7-vs-groovy-2-1-performance-comparison.html

groovy 2.5.4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【定时同步系列4】QPSK调制+OM定时(FFT实现及频域补偿)+信号分段处理+误码率曲线之MATLAB仿真(复信号模型)

关注公号【逆向通信猿】更精彩!!! 仿真结果 对于QPSK调制,仿真结果如下: **分析:**可以看出,补偿前的定时相位约为-0.1,补偿后的相位在0附近波动,但由于没有进行环路滤波(可采用卡尔曼滤波器),所以波动很大,这也导致了后续解调结果不理想,实际中必须加入滤波器…

Java 10迁移建议

你好&#xff0c;再一次到另一个热点。 我的名字是Java Champions平台工程师兼DevOps专家Peter Pilgrim。 如您所知&#xff0c;Java 9引入了模块系统。 您可能正在将服务迁移到JDK 10或更高版本&#xff0c;或者至少在考虑中。 我对企业的一般建议是&#xff0c;您越早迁移&a…

《调制解调算法》专栏导航贴

关注公号【逆向通信猿】更精彩&#xff01;&#xff01;&#xff01; 通信方面有关信号处理算法的MATLAB仿真&#xff0c;包含博主的一些宝贵经验&#xff0c;不定期更新&#xff01;&#xff01;&#xff01; 本系列博克力求从简到繁&#xff0c;无论是刚接触通信的小白&…

Office系列完全干净卸载工具合集(最全)

使用 Microsoft Fix it 卸载 Microsoft Office 套件 一、Windows 7、Windows Vista或Windows XP下卸载Office 1.MicrosoftEasyFix50416 工具用来卸载office 2003 MicrosoftEasyFix50416_Office2003.msi 2.MicrosoftEasyFix50154 工具用来卸载office 2007 MicrosoftEasyFix50…

谓词::不适合Java

Jim Laskey在OpenJDK core-libs-dev邮件列表上最近的消息“ RFR&#xff1a;CSR – JDK-8203428 Predicate :: not ”指出了JDK Bug JDK-8203428 [“ Predicate :: not”]。 JDK-8203428的“摘要”指出&#xff1a;“引入新的静态方法Predicate :: not&#xff0c;这将使开发人…

缓冲区溢出漏洞攻击之用户登录

登录程序模拟 在以下程序中,可以使用三种不同的方法检查用户输入的账号和密码是否与存储的用户名和密码匹配。通过编译生成可执行文件,并对其进行测试。该程序会将用户输入的账号、密码与名为password.txt的文件中的账号、密码进行比对,如果二者匹配,则授予访问权限。而实…

【锁相环系列1】锁相环的基本原理

关注公号【逆向通信猿】更精彩!!! 基本概念 相位同步 指两个信号的频率相等,相位差为一个固定值。当 ω i = ω 0 \omega_i=\omega_0 ω

【锁相环系列2】数字判决反馈环之BPSK信号解调MATLAB仿真(含环路滤波器参数设置)

关注公号【逆向通信猿】更精彩!!! 仿真结果 频偏补偿之前的星座图,是一个“环”。 频偏补偿后的BPSK信号星座图 解调误码率曲线 <

hadoop emr_在Amazon EMR上运行Hadoop MapReduce作业

hadoop emr不久前&#xff0c;我发布了如何使用CLI设置EMR群集的信息。 在本文中&#xff0c;我将展示如何使用适用于AWS的Java SDK来设置集群。 展示如何使用Java AWS开发工具包执行此操作的最佳方法是展示我认为完整的示例&#xff0c;因此让我们开始吧。 设置一个新的Maven…

Apache Spark中的自定义日志

您是否曾经对运行了几个小时的Spark作业感到沮丧&#xff0c;但由于基础设施问题而失败了。 您会很晚才知道此故障&#xff0c;并浪费了数小时的时间&#xff0c;当Spark UI日志也无法用于事后检查时&#xff0c;它会更加痛苦。 你不是一个人&#xff01; 在这篇文章中&…

【MFC系列1】之简单Win32程序

一、位运算 标志位组合&#xff1a;wParam MK_RBUTTON|MK_CONTROL|MK_SHIFT 标志位的判断&#xff1a;wParam & MK_LBUTTON 标志位的分离&#xff1a;wParam & ~MK_RBUTTON; 二、调用约定 __cdecl_stdcall是C Declaration的缩写&#xff08;declaration&#xff0c…

【MFC系列2】Win32项目转换为MFC项目

关注公号【逆向通信猿】更精彩&#xff01;&#xff01;&#xff01; 一、MFC的组成 a)必须有一个CWinApp的派生类&#xff1b; b)必须用派生类在全局定义一个对象theApp; c)在派生类中必须重写InitInstance虚函数&#xff1b; d)MFC程序就用CWinApp派生类中的InitInstance虚…

servlet面试常问问题_50个Servlet面试问答

servlet面试常问问题Servlet是Java EE的一个非常重要的主题&#xff0c;所有Web应用程序框架&#xff08;例如Spring和Struts&#xff09;都建立在它之上。 这使servlet成为Java访谈中的热门话题。 在这里&#xff0c;我提供了50个servlet面试问题的列表&#xff0c;并提供了答…

Win10图片查看器打不开图片,报错内存不足

关注公号【逆向通信猿】更精彩&#xff01;&#xff01;&#xff01; 按如下设置即可

学习Java的最佳方法

Java是某些人可能会说很难学习的语言之一&#xff0c;而其他人则认为它与其他语言具有相同的学习曲线。 两种观察都是正确的。 但是&#xff0c;由于Java具有平台无关性&#xff0c;因此在语言方面具有相当大的优势。 Java是一种低级语言&#xff0c;它以一种简单的方式来实现…

【MFC系列3】永远点不到的按钮

变量的声明与定义 全局变量theApp的定义 CXXXXApp theApp; // 定义在其他类中想要访问全局变量theApp时&#xff0c;需在stdafx.h中进行声明 #include "XXXX.h" extern CXXXXApp theApp; // 声明三个被系统接管的消息&#xff08;缺省&#xff0c;虚函数回调&…

CSAPP:Attack lab

关注公号【逆向通信猿】更精彩&#xff01;&#xff01;&#xff01; 原文地址&#xff1a;https://www.jianshu.com/p/db731ca57342 本文介绍的是CSAPP书籍中的第三个lab: Attack lab。通过这个lab我们能够更加清楚和深入的了解到缓冲区溢出的隐患&#xff0c;以及如何利用缓…

antlr java_使用ANTLR和Java创建外部DSL

antlr java在我以前的文章中&#xff0c;有一段时间我写了关于使用Java的内部DSL的文章。 在Martin Fowler撰写的《 领域特定语言 》一书中&#xff0c;他讨论了另一种称为外部DSL的DSL&#xff0c;其中DSL是用另一种语言编写的&#xff0c;然后由宿主语言进行解析以填充语义模…

【MFC系列-第7天】MFC类库封装原理

关注公号【逆向通信猿】更精彩&#xff01;&#xff01;&#xff01; 运算符重载 operator RECT* () {return this; }CString类库 例1 CString str;int n str.GetLength();::GetSystemDirectory(str.GetBuffer(1000), 1000);n str.GetLength();str.ReleaseBuffer();//必须…

【MFC系列-第8天】小型软件项目开发

第8天 小型软件项目开发 8.1 记事本开发 小技巧&#xff1a;用VC6新建工程&#xff0c;以资源方式打开系统自带notepad.exe中的MENU资源&#xff0c;加入到自己新建的工程中&#xff1b;然后再添加到VS工程中&#xff0c;即可获取现有exe的菜单资源。 EndDialog中传入的参数…