Java 7 vs Groovy 2.1性能比较

自从我与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倍。

现在是时候在日常开发中检查一些更现实的情况了。 我选择了简单的POJO / POGO(是的),并进行了一些简单的操作,只是为了确保JIT不会消除我的代码(相信我,他喜欢这样做)。 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

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

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

相关文章

[UE4]嵌套Canvas

转载于:https://www.cnblogs.com/timy/p/9090642.html

写博客的这几个月,获益良多

1.前言 也将近过年了&#xff0c;看了那么多人搞了年会总结。自己活跃社区这几个月&#xff0c;改变了不少&#xff0c;收获也不少。就想写下这段时间写文章的一些总结&#xff0c;统计下‘成绩’&#xff0c;说下感想&#xff0c;就写了这篇文章。这次总结的关键词就是&#x…

php 注册自动登录,php – 创建第二个自动登录用户的登录页面

我有一个登录页面如下&#xff1a;Username: Password: LoginCancel在这里我的session.controller.php文件&#xff1a;基本上,我想要做的是创建第二个登录页面,自动将值传递给会话控制器并登录.例如,如果我转到login-guest.php,我会将用户名和密码的默认值和然后有一个jquery点…

Pyqt5+python+ErIC6+QT designer

Eric6安装及配置 https://blog.csdn.net/weixin_41656968/article/details/80253012 Python3.6PyQt5Eric6.0环境配置 https://blog.csdn.net/wf307388339wf/article/details/78990899 eric6新建工程编写代码操作步骤 https://jingyan.baidu.com/article/37bce2be5d29911003f3a2…

探索Apache Camel Core –文件组件

文件轮询器是解决常见IT问题的非常有用的机制。 Camel的内置file组件非常灵活&#xff0c;并且有许多选项可用于配置。 让我们在这里介绍一些常用用法。 轮询输入文件的目录 这是典型的骆驼Route用于每秒轮询一次目录以查找输入文件。 import org.slf4j.*; import org.apache…

shiro 权限 URL 配置细节

转载于:https://www.cnblogs.com/hwgok/p/9100277.html

2016 年崛起的 JS 项目

本文是我对中文版 risingstars2016 的整理&#xff0c;而本人就是中文版的译者&#xff0c;首发于知乎专栏 前端周刊。共 21384 字&#xff0c;读完需 30 分钟&#xff0c;速读需 5 分钟。长江后浪推前浪&#xff0c;如果你能花 30 分钟读完我 6 个小时翻译的内容&#xff0c;相…

NPOI之Excel——设置单元格背景色

NPOI Excel 单元格颜色对照表&#xff0c;在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置&#xff0c;FillPattern 为单元格背景色的填充样式。NPOI Excel 单元格背景颜色设置方法&#xff1a; 123456ICellStyle style …

php 开启命令模式,如何启用PhpStorm中的命令行工具

本篇文章主要给大家介绍如何使用phpstorm中的命令行工具。PhpStorm下载地址&#xff1a;PhpStorm使用命令行工具&#xff0c;我们可以直接从IDE调用命令&#xff01;在我们使用任何命令行工具之前&#xff0c;我们必须在设置中启用它。涉及到的步骤如下&#xff1a;使用命令行工…

深入了解Java 8中的可选类API

作为Java程序员&#xff0c;我们所有人都经历了以下情况&#xff1a;我们调用一个方法来获取某个值&#xff0c;然后代替直接对返回值调用某些方法&#xff0c;我们首先必须检查返回值不为null&#xff0c;然后在返回值。 这是像Guava这样的外部API试图解决的难题 。 此外&…

CentOS7安装及配置vsftpd (FTP服务器)

CentOS7安装及配置vsftpd (FTP服务器) 1、安装vsftpd 1 yum -y install vsftpd 2、设置开机启动 1 systemctl enable vsftpd 3、启动ftp服务 1 systemctl start vsftpd.service 4、打开防火墙&#xff0c;开放21端口 1 firewall-cmd --zonepublic --add-port21/tcp --permanent…

React Native项目自动化打包发布

今天这篇文章的目的是在rn项目的构建&#xff0c;并不会涉及到rn框架或者使用的讲解&#xff0c;说起构建&#xff0c;特别是前端构建大家应该很快会想到webpack、Grunt、 Gulp等。而这些工具在rn项目中就显得有些鸡肋。所以在此给大家分享一下不使用构建工具实现rn项目自动化打…

Python程序员之面试必回习题

写在前面 近日恰逢学生毕业季&#xff0c;课程后期大家“期待苦逼”的时刻莫过于每天早上内容回顾和面试题问答部分【临近毕业每天课前用40-60分钟对之前内容回顾、提问和补充&#xff0c;专挑班里不爱说话就的同学回答】。 期待的是可以检验自己学习的成功&#xff1b;苦逼的是…

如何用正则表达式杀死Java

我们最近偶然发现了一个我们绝对不了解的现象&#xff1a;您可以使用简单的正则表达式杀死任何Java IDE以及任何Java进程… 回到大学后&#xff0c;我被告知正则表达式&#xff08;称为正则语法或3型语法&#xff09;总是以有限状态的自动机结束&#xff0c;因此可以在线性时间…

php for next,Nextcloud停留无限登录页面 PHP7的问题及解决方案

Nextcloud 14或者15 无法打开登录界面出现错误信息如下&#xff1a;内部服务器错误服务器不能完成你的请求。如果再次发生&#xff0c;请在下方将技术详情发送给服务器管理员。更多细节可以在服务器日志中找到.技术细节远程地址: 210.22.126.186请求 ID: kSPvbdWDU7yvwng3516v请…

开发VUE使用第三库,发现有bug怎么办?

写在前面 本文只针对使用vue技术栈&#xff0c;进行讨论。 正文 使用vue技术栈开发&#xff0c;难免会使用第三库&#xff0c;这大大提高了我们开发的效率。然而&#xff0c;这是第三方库有bug怎么办&#xff1f; 既然有bug&#xff0c;就是现有功能没有达到预想效果。除了&a…

Java正则表达式中的反向引用

Java正则表达式中的反向引用是Java提供的另一个重要功能。 要了解反向引用 &#xff0c;我们首先需要了解群组 。 正则表达式中的分组意味着将多个字符视为一个单元。 通过将要分组的字符放在一组括号“&#xff08;&#xff09;”中来创建它们。 每组括号对应一个组 。 反向引…

SpringMVC原理MVC设计思想

什么是MVC&#xff1f; MVC是一种架构模式 --- 程序分层&#xff0c;分工合作&#xff0c;既相互独立&#xff0c;又协同工作 MVC是一种思考方式 --- 需要将什么信息展示给用户? 如何布局&#xff1f; 调用哪些业务逻辑&#xff1f; MVC流程图如下图所示&#xff1a; MVC核心思…

Hbase 的javaAPI基本操作用 在idea上的实现

1.保证集群开启&#xff1a; jps有如下进程 2.pom文件中的依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sche…

用php求矩形周长,PHP实现的简单三角形、矩形周长面积计算器分享

运用php面向对象的知识设计一个图形计算器&#xff0c;同时也运用到了抽象类知识&#xff0c;这个计算器可以计算三角形的周长和面积以及矩形的周长和面积。本图形计算器有4个页面&#xff1a;1.php图形计算器主页index.php; 2.形状的抽象类shape.class.php; 3三角形计算…