Java:GraalVM数据库流性能

GraalVM是JVM块的新成员。 它是一个开源虚拟机,能够同时运行多种编程语言,例如Java,Rust和JavaScript。 GraalVM还有一个新的内部代码优化器管道,在某些情况下,与其他JVM相比,它可以显着提高性能。 了解如何获得GraalVM的好处并无需修改代码即可更快地执行代码。

GraalVM数据库

什么是GraalVM?

以前的JVM,例如Oracle JVM和OpenJDK JVM(均称为“ HotSpot”),已经存在了很长时间。 随着时间的推移,它们已经有了长足的发展,并且在过去的几十年中,与Java 1.0 JVM相比,我们看到了性能飞速增长。 JVM的重大改进包括即时编译(JIT),C2编译器,转义分析等,这些都为这一积极的发展做出了贡献。 但是,与所有技术一样,它们将在某个时候开始达到平稳状态。

GraalVM是一个崭新的开始,由此从头开始开发新的内部架构。 特别是,名为Gaal的JIT编译器已经过重新设计。 毫不奇怪,就像所有其他GraalVM组件一样,JIT编译器本身是用Java编写的。 事实证明,与某些现有的JVM相比,Graal有时能够更好地优化代码。 特别是,某些Stream类型似乎受益于在Graal下运行。

数据库流性能

有许多编写Java流的方法。 最明显的方法是使用内置的Java函数Stream::ofCollection::stream方法之一。 但是,这些方法要求Stream中的元素以Java对象的形式先验存在。 这意味着编译器无法在大多数情况下优化它们。

因此,我选择使用基于流的ORM工具Speedment。 该工具与一项技术结合使用,该技术可将数据库内容提取到JVM内存中的快照中,并直接从RAM中创建Java流。 因此,数据库表是堆外存储的,从而有可能避免创建Java对象。 因为Graal具有改进的性能优化管道,所以它可能可以更好地优化临时中间流对象。 从理论上讲,Speedment和Graal将是一个完美的选择。 因此,我非常渴望测试
在GraalVM而不是HotSpot下运行时,Speedement的极端性能将受到影响。

以下Speedment数据库流用于测试性能。 在我的上一篇文章中可以找到有关这些流及其工作方式的更多信息,您可以在这里找到。

private static final Predicate RATING_EQUALS_PG_13 =Film.RATING.equal(GeneratedFilm.Rating.PG13);private static final Comparator LENGTH_DESCENDING = Film.LENGTH.reversed();@Benchmark
public long filterAndCount() {return films.stream().filter(RATING_EQUALS_PG_13).count();
}@Benchmark
public IntSummaryStatistics Complex() {return films.stream().sorted(LENGTH_DESCENDING).skip(745).limit(5).mapToInt(Film.RENTAL_DURATION.asInt()).summaryStatistics();
}

分别在GraalVM和HotSpot下运行时获得以下JMH输出:

Graal:
Benchmark              Mode  Cnt         Score        Error  Units
Bench.Complex         thrpt    5   8453285.715 ± 383634.200  ops/s
Bench.filterAndCount  thrpt    5  29755350.558 ± 674240.743  ops/sHotSpot:
Benchmark              Mode  Cnt         Score        Error  Units
Bench.Complex         thrpt    5   5334041.755 ± 176368.317  ops/s
Bench.filterAndCount  thrpt    5  20809826.960 ± 963757.357  ops/s

拥有4个CPU内核的笔记本电脑上的GraalVM / Speedment能够每秒产生和消耗超过3000万个数据库流,这真是令人惊讶。 想象一下在具有24或32个CPU内核的服务器级节点上的性能。

这是它在图表中的外观(越高越好):

GraalVM数据库

普通流性能

初始测试显示了针对不同JVM的内置Java流(如Stream.of(“A”, “B”, “C”)List::stream Stream.of(“A”, “B”, “C”)不同相对性能指标,这些List::stream了各种操作。 我希望一旦GraalVM成熟,这些流类型也将全面提高性能。 也许我会在以后的文章中介绍。

设定

以下JMH设置用于GraalVM和HotSpot:

# Detecting actual CPU count: 8 detected
# JMH version: 1.21
# VM version: JDK 1.8.0_172, GraalVM 1.0.0-rc6, 25.71-b01-internal-jvmci-0.48
# *** WARNING: JMH support for this VM is experimental. Be extra careful with the produced data.
# VM invoker: /Applications/graalvm-ce-1.0.0-rc6/Contents/Home/jre/bin/java
# VM options: -Dfile.encoding=UTF-8
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 8 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time# Detecting actual CPU count: 8 detected
# JMH version: 1.21
# VM version: JDK 1.8.0_171, Java HotSpot(TM) 64-Bit Server VM, 25.171-b11
# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java
# VM options: -Dfile.encoding=UTF-8
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 8 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time

上面的测试是在MacBook Pro(Retina,15英寸,2015年中),2.2 GHz Intel Core i7、16 GB 1600 MHz DDR3(具有4个CPU内核和8个线程)上进行的。 从日志中可以看出,我们应该谨慎地使用JMH的Graal得出结论,因为JMH支持目前处于试验阶段。

旋转一下

使用Speedment初始化创建Speedment项目模板这里 。

在此处下载最新版本的GraalVM。

可以在此处找到基准测试的源代码。

随时在另一个硬件平台上进行性能测试,并在下面的评论中报告结果。

结论

GraalVM接缝是一种有前途的技术,可以提高某些Java流类型的性能。

GraalVM与Speedment的JVM内存中加速结合使用可以为数据分析应用程序提供显着的流性能。

翻译自: https://www.javacodegeeks.com/2018/10/java-graalvm-database-stream-performance.html

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

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

相关文章

kubelet启动失败_kubelet 架构浅析

一、概要kubelet 是运行在每个节点上的主要的“节点代理”,每个节点都会启动 kubelet进程,用来处理 Master 节点下发到本节点的任务,按照 PodSpec 描述来管理Pod 和其中的容器(PodSpec 是用来描述一个 pod 的 YAML 或者 JSON 对象…

shell 提取sql 的字段名表名_SQL代码风格规范

作为新时代SQL Boy,大部分时间都是在写sql,很多时候看到别人写的代码实在是不规范,命名随便写,没有缩进,看起来很没有逻辑性,今天分享下我自己的一些规范,从这里修改而来。--名称:xx…

亚马逊ec2 实例删除_亚马逊免费使用套餐:在EC2 Linux实例上安装Tomcat 7

亚马逊ec2 实例删除Amazon Web Services提供了12个月的免费使用期限,使开发人员可以在云中运行任何他们想要的东西。 免费层包括14个服务,其中Web开发人员最关注EC2服务。 EC2是一项服务,通过停止和启动Windows和/或Linux的虚拟实例来提供可调…

使用混合多云每个人都应避免的3个陷阱(第4部分)

每天都在肆意宣传云,但每个人都应避免三个陷阱。 从云,混合云到混合多云,您被告知这是确保业务数字化未来的一种方式。 您必须做出的这些选择不会排除提高客户体验和敏捷交付这些应用程序的日常工作。 让我们开始一段旅程,仔细研…

Java,JavaFX的流畅设计风格拨动开关

嗨,这次我将在新版本的JMetro中讨论新的Toggle Switch样式。 拨动开关是一种近年来变得非常流行的控件。 我前一段时间在ControlsFX库中添加了JavaFX实现。 刚刚发布的JMetro版本4.1中提供了此新样式。 什么是拨动开关 在以前的文章中,我谈到了切换开…

python解析多层嵌套json_Python爬虫解析多个嵌套JSON,多级,json

Python爬虫解析多级嵌套json最近刚接触Python爬虫,正好最近肺炎在全国蔓延,所以准备从网站爬取肺炎实时数据,并解析自己想要的数据。获取json数据网址为 https://m.look.360.cn/events/feiyan爬取网址:def main():urlhttps://m.lo…

如何使用vps 异地组网_使用ZEROTIER异地组建内网(局域网)

一、注册账号(该网站打开比较慢,但并不影响组网后的网速)二、建立虚拟局域网网(获取Network ID)1.选择菜单栏的Networks菜单2.选择创建网络3.注意获取到的Network ID(需要在每台组网的电脑上加入这个network id)4.大部分设置默认就可以了.三、下载软件点菜单中的Dow…

编写一个watchdog.sh脚本_五大原因!为何要将Jupyter Notebook转换为python脚本?

全文共3360字,预计学习时长9分钟图源:unsplash大多数数据科学在线课程都把Jupyter Notebook作为教学媒介,这是因为初学者在Jupyter Notebook的单元格中编写代码,比编写包含类和函数的脚本更容易。另一个原因在于它使浏览和绘制数据…

java 多线程 总结_Java 多线程总结

昨天熬了个通宵,看了一晚上的视频,把java 的多线程相关技术重新复习了一遍,下面对学习过程中遇到的知识点进行下总结。首先我们先来了解一下进程、线程、并发执行的概念:进程是指:一个内存中运行的应用程序&#xff0c…

基本服务-使用大使网关

这是我对Knative服务进行实验的延续,这次是围绕在Knative服务应用程序之上构建网关。 这是基于我之前的两篇文章- 使用Knative部署Spring Boot App以及在Knative中进行服务到服务的调用 。 为什么在Knative应用程序之上使用网关 为了解释这一点,让我谈谈…

mysql function 表名作为参数_mysql 常用的分组聚合函数

mysql 常用的分组聚合函数1.聚合运算一般情况下,需要的聚合数据(和,平均值,最大,最小等)并不总是存储在表中,但是可以执行存储数据的计算来获取它.根据定义,聚合函数对一组值执行计算并返回单个值.MySQL提供了许多聚合函数,包括AVG,COUNT,SUM,MIN,MAX等.除COUNT函数外,其它聚合…

java加减乘除运算顺序_java 实现加减乘除混合运算

初衷:解决小学一年级到四年级 基本加减乘除混合运算基本思路:表达式:10032-200(10000/5(100/2))此类表达式我们称之为中缀表达式(运算符在数字的中间),如果我们稍加转换,转化为100, 3, , 2, , 200, -, 10000, 5, /, 100, 2, /, , …

java integer valueof_对 Java Integer.valueOf() 的一些了解

从一道选择题开始分析选项A选项A中比较的是i01和i02,Integer i0159这里涉及到自动装箱过程,59是整型常量,经包装使其产生一个引用并存在栈中指向这个整型常量所占的内存,这时i01就是Integer 的引用。而int i0259由于int是基本类型…

java web 伪静态_【Java Web】使用URLRewrite实现网站伪静态

大部分搜索引擎都会优先考虑收录静态的HTML页面,而不是动态的*.jsp、*.php页面。但实际上绝大部分网站都是动态的,不可能全部是静态的HTML页面,因此互联网上大部分网站都会考虑伪静态——就是将*.jsp、*.php这种动态URL伪装成静态的HTML页面。…

使用Spring WebFlux从Corda节点流式传输数据

自上次发布以来已经有一段时间了,但我终于回来了! 由于我仍在我的项目中,因此我将再次撰写有关使用Corda的文章。 这次,我们将不再关注Corda,而是将Spring与Corda结合使用。 更具体地说,Spring WebFlux。 为…

mysql 批量加索引_mysql优化:按期删数据 + 批量insert + 字符串加索引为何很傻

嗯,犯了一个很低级的错误,最近暴露出来了。html背景:mysql1. 内部平台,接口间断性无返回,查询日志注意到失败时,接口耗时达到4000(正常状态:100ms)git2. 增长日志打点,在关键步骤插入…

MySQL中引入存储引擎意义是_mysql学习九:存储引擎、存储过程和函数的引入

存储引擎:存储引擎是mysql特有的,共有7种,常用的有myisam、memory、innodb查看表的存储引擎:show create table 表名;修改表的存储引擎:alter table 表名 engine存储引擎名称;1.myisam存储引擎:可转换为压缩…

python土味情话_土味情话表情包下载

喵星人土味情话表情包是一款很甜的表情图片,现在的聊天模式三句话离不开表情包,而且小编带来的这款表情包非常的适合情侣日常撩,最新的土味情话,需要的朋友可以前来本站下载。土味情话大全一、“对不起。”“你永远都不要和我说对…

多云互操作性!=云服务聚合

多云定义为一种方法,它将来自多个云供应商的多个云(公共云或私有云)组合在一起。 但是,这不是来自不同供应商的各种服务的集合,它需要一种强制性的胶合剂–云不可知的方法,并在所有提供商之间实现互操作性。…

如何在Spring中将@RequestParam绑定到对象

您是否在请求映射方法中用RequestParam注释了多个参数,并认为它不可读? 当请求中需要一个或两个输入参数时,注释看起来非常简单,但是当列表变长时,您可能会感到不知所措。 您不能在对象内部使用RequestParam批注&…