使用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,一经查实,立即删除!

相关文章

信道接入技术及协议

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

MATLAB | 解决打开延迟的情况

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

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

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

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

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

6个您需要了解的日志管理工具(以及如何使用它们)

如果没有正确的工具来汇总和解析日志数据,则几乎不可能找到并了解您正在寻找的信息。 日志有无穷无尽的用途,因为日志本身是无止境的。 应用程序日志,安全日志,BI日志, 林肯日志 (好吧,也许不是…

JDK 12开关表达式遇到意外的枚举值

正如我在“ 玩JDK 12的Switch表达式 ”一文中所写的那样, JDK 12 Early Access Build使JEP 325的实现(“ Switch Expressions(Preview)”)的实验变得容易。 我的帖子“ JDK 12:实际中的切换语句/表达式 ”使…

Matlab画图线型、符号及颜色设置

1. matlab 中线条的主要属性 Color: 颜色LineStyle: 线型LineWidth: 线宽Marker: 标记点的形状MarkerFaceColor: 标记点填充颜色MarkerEdgeColor: 标记点边缘颜色MarkerSize: 标记点大小 2. 各种属性的名称 2.1 线型 -Solid line (default) – Dashed line : Dotted line …

休眠面试问答-最终清单

这是有关Hibernate Framework的一些最重要问题的摘要,可能会要求您在访谈中回答! 您无需担心下一次面试的机会,因为Java Code Geeks在这里为您服务! 您可能会被问到的大多数事情都收集在下面的列表中。 我们的Hibernate面试问题将…

matlab 进度条/waitbar 显示运行进度

当运行大程序,需要跑大量数据的时候,使用进度条可以看到程序究竟运行到什么地方了,哈哈,要不干等着难受(╯﹏╰)…… waitbar的作用是打开或者更新进度条。 1 语法结构 (1.1) h waitbar(x,‘message’) x表示进度条的比例长度…

MATLAB 命令 BOXPLOT

Matlab中有关boxplot(X)命令的解释: boxplot(X) produces a box and whisker plot for each column of the matrix X. The box has lines at the lower quartile, median, and upper quartile values. Whiskers extend from each end of the box to the adjacent v…

latex-bib参考文献人名特殊字符

https://blog.csdn.net/weixin_43413198/article/details/105468843

Matlab RGB 颜色对照表(0-1之间取值)

https://blog.csdn.net/qq_38882446/article/details/100886087

空间点过程(Point Processes)和随机测度(Random Measure)

1 空间点过程与随机测度(一):从数星星说起 1.1 数星星的数学 小时候,在晴朗的夜里,我喜欢仰望星空,去数天上的星星——那是无忧无虑的快乐童年。长大后,当我们再度仰望苍穹,也许会思…

add a legend to a boxplot in MATLAB

1. 给同组数据分类加legend figure; colors [1 0 0; 1 0 0; 0 0 1; 0 0.5 0; 0 0.5 0; 0 0.5 0]; x boxplot(rand(100,6),Colors,colors); legend(Group A,Group B,Group C)2.给不同组数据加legend box_vars findall(gca,Tag,Box); hLegend legend(box_vars([8,6]), {N…

JavaFX技巧31:遮罩/剪切/ Alpha通道

选择条 最近,我不得不实现一个自定义控件,该控件使用户可以从项目列表中选择一个项目。 此“ SelectionStrip”控件必须水平放置项目,并且在项目过多的情况下,允许用户左右水平滚动。 该控件将在空间受限的区域中使用,…

通信中的频谱效率与能量效率

频谱效率(Spectral Efficiency) 频谱效率(Spectral Efficiency,SE)简称谱效,也称系统容量、频带利用率。 该指标用来衡量系统的有效性,描述了能够提供多少容量。 它定义为系统传输的有效信息速率R除以通信信道带宽B&a…

积分公式大全

https://kexue.fm/sci/integral/ 《积分公式大全》网络版本——By BoJone 引用原作者的话: 本附件所有公式来自《高等数学第三版》。   该书信息:同济大学数学教研室编,高等教育出版社,1988年4月第三版,ISBN 7-04-0…

Latex快速入门系列 -- 在TexStudio中正确插入参考文献的基本操作

目录 1 操作流程2 四种基本的文献格式比较3 文献数据库.bib的编写 1. 操作流程 1.1 创建文章主文件。Ctrl N 新建一个文件,Ctrl S 手动保存,保持文件后缀名.tex。得到一个.tex文件:文章名.tex,该文件用来编写你的文章的具体内…

MongoDB索引策略和索引类型

1. MongoDB索引策略和索引类型–简介 MongoDB是一个开放源代码,面向文档的跨平台数据库,它使用C 开发,并且是最流行和使用最广泛的NoSQL类型数据库之一。 它可在具有键-值对的类JSON文档的顶部运行,其键值对在每个文档中都无法定义…

zeal刷新不出来_推进重涂市场标准化,立邦率先推出刷新服务“八大验收标准”...

点击蓝字【立邦中国】,设置星标关注。7月,立邦刷新服务率先在墙面重涂行业提出突破性的“八大验收标准”,根据不同的涂刷工艺来采用定制化的验收标准,更进一步推动重涂市场的标准化和规范化。自2011年推出立邦刷新服务至今&#x…