使用Java流和In-JVM-Memory的超低延迟查询

自然界的基本规则(例如光速和通用信息论)对我们可以从传统系统体系结构中获得的最大性能设置了明显的限制。

了解您作为Java开发人员如何使用JVM技术和Java流将性能提高几个数量级。

Java流

例如,如果应用程序服务器和数据库服务器相距100 m(约330英尺),则光速带来的往返延迟将略微超过600 ns。 更重要的是,由于采用了TCP / IP协议,尽管采用了黑带技巧(例如自定义内核),但10 GBit / s连接上的单个数据包往返延迟几乎无法优化到小于25 us(= 25,000 ns)。构建,繁忙的轮询和CPU关联性。

在本文中,我将展示如何使用JVM内存技术直接从RAM创建Java Streams。 我们将使用名为Speedment的基于Stream的Java ORM,它可以使用标准格式执行数据分析
java.util.stream.Stream对象以及如何在200 ns内创建和完成其中一些流的方法,令人惊讶的是,这仅是访问64位主内存的CPU延迟的两倍。

Java流

200 ns比远程数据库(100 m)的理论最小延迟快125倍以上,该远程数据库的内部处理延迟为零,并且单个TCP数据包可以传达查询和响应。 在实时方案中,数据库的内部处理延迟永远不会为零,并且查询和结果通常都以多个TCP包发送。 因此,在许多情况下,加速因子可能是1000倍甚至更多。

数据库

在下面的示例中,我们将Sakila数据库内容中的数据用于MySQL。 Sakila是为电影租赁商店建模的示例数据库。 它具有名为Film,Actor,Category等的表格,可以在此处免费下载。 应该注意的是,这是一个小型数据库,但事实证明,许多Speedment流操作的复杂度为O(1)O(log(N()) ,因此无论大小如何,都确保相同的速度或较小的数据集。

步骤1:建立专案

首先,我们需要配置我们pom.xml -file使用最新Speedment依赖和Maven插件。 最快的方法是生成一个
使用可以在此处找到的Speedment Initializer的pom.xml -file。 首先,选择数据库类型“ MySQL”并确保启用了“内存中加速”,然后按“下载”,您将获得一个完整的项目文件夹,其中包含为您自动生成的Main.java文件。

Java流

Java流

接下来,解压缩项目文件夹的zip文件,打开命令行,转到解压缩的文件夹( pom.xml文件所在的文件夹),然后输入以下命令:

mvn speedment:tool

接下来,连接到数据库并开始:

步骤2:产生程式码

从数据库中加载模式数据后,可以通过按“生成”按钮来生成完整的Java域模型。

步骤3:编写应用程序代码

为了使用Speedment,首先需要创建一个Speedment实例。 这可以通过使用在步骤2中与域模型一起自动生成的构建器来完成。
Main.java文件并替换其中的代码
此代码段的main()方法:

Speedment app = new SakilaApplicationBuilder()// Replace this with your own password.withPassword("sakila-password")// Enable in-JVM-memory acceleration// By just commenting away this line, we can disable acceleration.withBundle(InMemoryBundle.class).build();// Load data from database into a snapshot view if// we have installed In-JVM-Accelerationapp.get(DataStoreComponent.class).ifPresent(DataStoreComponent::load);

为了演示基本功能,我们将首先编写一个仅打印所有电影的应用程序:

// Obtains a FilmManager that allows us to
// work with the "film" table
FilmManager films = app.getOrThrow(FilmManager.class);// Create a stream of films and print
// each and every film
films.stream().forEach(System.out::println);

上面的代码将产生以下输出(为简洁起见,以下简称):

FilmImpl { filmId = 1, title = ACADEMY DINOSAUR, …, length = 86, ... }
FilmImpl { filmId = 2, title = ACE GOLDFINGER, ..., length = 48, ...}
FilmImpl { filmId = 3, title = ADAPTATION HOLES, ..., length = 50, ...}
...

步骤3:使用筛选器

Speedment流支持所有流操作,包括过滤器。 假设我们只想过滤那些长于60分钟的影片,并计算发生的次数。 可以这样完成:

films.stream().filter(Film.LENGTH.greaterThan(60)).count();System.out.format("There are %,d films longer than 60 minutes.", count);

这将产生以下输出:

There are 896 films longer than 60 minutes

可以将任意数量的过滤器应用于流,并将谓词提供给
filter()方法可以使用
and() / or()运算符。

步骤4:设定JMH

到目前为止,我们还没有看到任何性能数据。 在本文中,我们将使用JMH进行基准测试。 JMH是用于构建,运行和分析以Java和其他针对JVM的其他语言编写的基准测试的Java工具。

我们将使用两种流类型来进行性能评估:

    1. 这是一个相当简单的流程,我们在其中对评级等于PG-13的电影进行计数,称为“滤镜和计数”
    2. 在更复杂的流中,我们按照LENGTH顺序对所有电影进行排序(降序),然后跳过前745部电影,然后处理以下5部电影,从而从这5部电影中提取租借时间,最后计算出这些整数的统计值(即最小值,最大值和平均值)。 此类型称为“复杂”。

以下代码摘录显示了我们将要运行的基准测试:

private static final Predicate RATING_EQUALS_PG_13 = Film.RATING.equal(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();
}

以下设置用于单线程延迟测量:

# JMH version: 1.21
# VM version: JDK 10, Java HotSpot(TM) 64-Bit Server VM, 10+46
# VM invoker: /Library/Java/JavaVirtualMachines/jdk-10.jdk/Contents/Home/bin/java
# VM options: -javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=63173:/Applications/IntelliJ IDEA CE.app/Contents/bin -Dfile.encoding=UTF-8
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: com.example.Bench.complex

使用SQL与MySQL数据库进行流传输

对我的笔记本电脑(MacBook Pro,2015年中,2.2 GHz Intel Core i7,16 GB RAM)上的标准MySQL数据库(版本5.7.16)运行这些查询将产生以下输出:

SINGLE-THREADED LATENCY (Lower is better)
Benchmark             Mode  Cnt  Score    Error  Units
Bench.complex         avgt    5  0.003 ±  0.001   s/op
Bench.filterAndCount  avgt    5  0.001 ±  0.001   s/opMULTI-THREADED THROUGHPUT (Higher is better)
Benchmark              Mode  Cnt     Score     Error  Units
Bench.complex         thrpt    5  1714.980 ± 343.655  ops/s
Bench.filterAndCount  thrpt    5  3154.984 ± 318.881  ops/s

使用MySQL数据库中的JVM内存加速功能进行流传输

启用JVM内存中加速并在笔记本电脑上再次运行相同的基准测试,将产生以下结果:

SINGLE-THREADED LATENCY (Lower is better)
Benchmark             Mode  Cnt   Score    Error  Units
Bench.complex         avgt    5  ≈ 10⁻⁶            s/op
Bench.filterAndCount  avgt    5  ≈ 10⁻⁷            s/opMULTI-THREADED THROUGHPUT (Higher is better)
Benchmark              Mode  Cnt         Score         Error  Units
Bench.complex         thrpt    5   4793915.881 ±  374680.158  ops/s
Bench.filterAndCount  thrpt    5  16958800.191 ± 1023015.568  ops/s

在一台旧笔记本电脑上每秒能够产生和消耗近1700万个视频流的能力真是令人惊讶。 具有许多CPU内核的现代服务器级计算机将很容易每秒能够产生和消耗超过2500万个流。

延迟的JMH时间分辨率不足以测量足够的准确性。 通过使用一个线程运行吞吐量测试并将结果取反,平均“过滤器和计数”延迟估计为1 / 5,564,678 = 180 ns。 这种更准确的等待时间估算可提供大约5,000而非10,000的估算性能提升因子。

结论

启用JVM中的内存加速可以大大提高性能。 在上述基准测试中:

单线程延迟减少了以下因素:

复合体:约3,000

筛选和计数:〜5,000

多线程吞吐量增加了以下因素:

综合楼:2,700

筛选和计数:5,300

作为说明,这意味着具有一百万个子查询的复合JVM操作会将其聚合数据延迟从1小时减少到1秒。

笔记

为了提高SQL性能,将流(自动)呈现给SQL查询。 呈现的“过滤并计数” SQL查询如下所示:

SELECT COUNT(*) FROM (SELECT `film_id`,`title`,`description`,`release_year`, `language_id`,`original_language_id`,`rental_duration`,`rental_rate`, `length`,`replacement_cost`,`rating`,`special_features`,`last_update` FROM`sakila`.`film` WHERE (`rating`  = ? COLLATE utf8_bin)
) AS A
, values:[PG-13]

评级列中定义了一个索引。

可以看出,所有计数都是在数据库端完成的,并且流没有将任何不必要的Film对象从数据库拉入JMH应用程序。

源代码

可以在此处查看基准测试的源代码。

摘要

在本文中,您已经了解了如何使用Speedment Free显着减少数据分析Java应用程序中的延迟,同时提高吞吐量。

加速因素是几个数量级。

翻译自: https://www.javacodegeeks.com/2018/09/ultra-low-latency-querying-with-java-streams-and-in-jvm-memory.html

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

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

相关文章

matlab写出二维数组

%用matlab将二维数组写入txt文件 %比方说 矩阵A 为 A[1 2 3;4 5 6]; %那么程序 为 fidfopen(‘A1.txt’,‘w’); [b1 b2]size(A); for i1:b1 for j1:b2 fprintf(fid,’%10d’,A(i,j)); end fprintf(fid,’\n’); end fclose(fid); https://blog.csdn.net/susu_love/article…

【渝粤题库】广东开放大学 英语语法与基础写作 形成性考核 (2)

选择题 题目:If _______ want to stay in good shape, you should do more exercise. 题目:At last he got home, ________ and . 题目: must work hard so that they can achieve success. 题目:The weather in Guangzhou is dif…

【渝粤题库】广东开放大学 跨文化商务沟通 形成性考核

选择题 题目: 3. The Chinese word “蝙蝠” carries the same connotative meanings with the English word “bat”. 选择一项: 题目: 4. The Chinese word “龙” carries the same denotative meaning with the English word “dragon”…

累积:轻松自定义Java收集器

Accumulative是针对Collector<T, A, R>的中间累积类型A提出的接口Collector<T, A, R>以使定义自定义Java Collector更加容易。 介绍 如果您曾经使用过Java Stream &#xff0c;那么很可能使用了一些Collector &#xff0c;例如&#xff1a; Collectors.toList C…

信道接入技术及协议

1. 信道共享方式 在普通的通信系统中&#xff0c;信道共享方式有3种&#xff1a;点对点、点对多点和多点共享。 1.1 点对点 点对点是最简单的信道共享方式。其特点是只有两个节点共享无线信道。在单信道时&#xff0c;两个节点可以通过半双工方式实现共享&#xff0c;在双信…

【渝粤题库】陕西师范大学151101 经济法概论作业 (笔试题型)

《经济法概论》作业 一、单项选择题 1、不可成为经济法律关系客体的是&#xff08; &#xff09; A. 有价证券 B. 无形资产 C. 建筑工程 D.国家保护文物等禁止流通物 2、仲裁实行&#xff08; &#xff09; A.一裁终局制 B.两裁终局制 C.三裁终局制 D.裁终局制 3、下列关于个人…

jdk8 cms g1gc_G1 vs CMS vs平行GC

jdk8 cms g1gc这篇文章是我们一年前进行的实验的跟进&#xff0c;比较了现实环境中不同GC算法的性能。 我们进行了相同的实验&#xff0c;将测试扩展为包含G1垃圾收集器&#xff0c;然后在不同的平台上运行了测试。 今年&#xff0c;我们的测试使用了以下垃圾收集器&#xff1a…

【渝粤题库】陕西师范大学152103 公共行政学

《公共行政学&#xff08;专科&#xff09;》作业 一、单选题 1&#xff0e;“政治与行政二分”最早的提出者是&#xff08; &#xff09;。 A.凯恩斯 B.布坎南 C.韦伯 D.威尔逊 2&#xff0e;新公共管理运动肇始于&#xff08; &#xff09;。 A.英国 B.美国 C.德国 D.新西兰 …

Matlab查看数组大小的命令——size、length、numel和ndims

1 size 功能&#xff1a;主要用来获得矩阵的各个维数的大小&#xff0c;或者指定维数的大小。 语法&#xff1a; d size(X) [m,n] size(X) m size(X,dim) [d1,d2,d3,…,dn] size(X) 其语法应用比较灵活。 2 length 功能&#xff1a;用来获得数组长度&#xff0c;即…

Java的精妙之处,包括基元和变量参数数组

在我最近的博客文章Arrays.hashCode&#xff08;&#xff09;与 DZone联合版本的评论中提出了一个有趣的问题。 Objects.hash&#xff08;&#xff09; “。 该评论的作者建立了一些示例&#xff0c;这些示例与我的博客文章中使用的示例相似&#xff0c;并且显示出与我看到的结…

【渝粤题库】陕西师范大学163201 旅游科学引论作业(专升本)

《旅游科学引论》作业 一、简答题 1、旅游是什么&#xff1f; 2、旅游学的研究对象是什么&#xff1f; 3、旅游能干什么&#xff1f; 4、什么是旅游学&#xff1f; 5、旅游的本质是什么&#xff1f; 6、旅游学的学科性质是什么&#xff1f; 7、旅游学的学科如何构成&#xff1f…

【渝粤题库】陕西师范大学180103市场营销学Ⅰ作业(高起专)

《市场营销学I》作业 一、单项选择题 1、人的需求是无限的&#xff0c;但是有限的&#xff08; &#xff09;限制了人们的大部分欲求。 A&#xff0e;场所 B&#xff0e;商品交换关系 C&#xff0e;人口 D&#xff0e;购买力 2、市场营销的核心是&#xff08; &#xff09;。 …

MATLAB | 解决打开延迟的情况

问题 最近打开matlab&#xff0c;一直没有反应&#xff0c;大概几分钟后&#xff0c;才开始有反应。 网上关于matlab启动出现延迟的方法有很多种解决方法。但都是针对破解版的&#xff0c;而装正版matlab2020b&#xff0c;缺少license文件。对于此&#xff0c;我们尝试用另外一…

【渝粤题库】陕西师范大学200751 《操作系统》作业

《操作系统》作业 一&#xff0e;填空题。 1.加在计算机硬件上的第一层软件为 它是微机以至任何一台计算机必须配置的系统软件。 2.操作系统设计时追求的目标中&#xff0c;其有效性是指 。 3.批(包括多道和单道)处理系统的最大缺点是 &#xff0c;从而使得用户调试程序的周期…

50 个具有挑战性的概率问题 [01/50]:袜子抽屉

一、说明 我最近对与概率有关的问题产生了兴趣。我偶然读到了弗雷德里克莫斯特勒&#xff08;Frederick Mosteller&#xff09;的《概率论中的五十个具有挑战性的问题与解决方案》&#xff08;Fifty Challenge Problems in Probability with Solutions&#xff09;一书。我认为…

matlab中数值的取整、四舍五入、文本输出

一、取整函数 Matlab取整函数有: fix, floor, ceil, round四种&#xff0c;具体使用方法如下&#xff1a; (1) fix 朝零方向取整 如 fix(-1.3)-1 fix(1.3)1; (2) floor 朝负无穷方向取整&#xff08;不超过x 的最大整数.&#xff08;高斯取整&#xff09;&#xff09; …

【渝粤题库】陕西师范大学201341 刑事诉讼法学作业

《刑事诉讼法》作业 一、单项选择题 1&#xff0e;公诉案件中的犯罪嫌疑人有权委托辨护人的时间是下列选项中的哪一个&#xff1f;&#xff08; &#xff09; A 自侦查机关立案之日起 B 自被采取强制措施之日起 C 自案件移送起诉之日起 D 自案件做出起诉决定之日起 2&#xff0…

制作程序化装饰花纹图案_装饰图案

制作程序化装饰花纹图案装饰图案 我不经常使用的一种设计模式是Decorator 。 我不确定为什么这种模式不受欢迎&#xff0c;因为它很方便。 装饰器模式允许以受控方式向对象添加功能。 即使在使用静态类型的语言时&#xff0c;也可以在运行时运行&#xff01; 装饰器模式是子类的…

[渝粤题库]西北工业大学电力系统自动装置

电力系统自动装置 一. 单选题 &#xff08;共21题,共42分&#xff09; 发电机调速系统的失灵区&#xff08; &#xff09;。 &#xff08;2分&#xff09; A.越大越好 B.越小越好 C.要合适同步发电机无功调节特性特性下倾&#xff0c;对应的调差系数&#xff08; &#xff09;…

game,match,competition,contest区别

【1】game&#xff1a; 指决定胜负的比赛&#xff0c;游戏&#xff0c;通常有一定的规则&#xff0c;参加者必须遵守&#xff0c;且多以个人对抗或集体对抗形式根据一定的规则进行的比赛。 【2】match&#xff1a; 多指重要的&#xff0c;参加队数较多的大型体育运动项目比赛&…