Java IO基准测试:Quasar与异步ForkJoinPool与ManagedBlock

“ Arien看到了我们运行的parallelStreams和ForkJoin基准测试的结果后,在Twitter上与我们联系。 这激起了他的兴趣,因此他进行了一些自己的测试,将Quasar纤维加入了混合物。 这是他的结果和结论。” –塔基皮(Takipi)Alex Zhitnitsky

Arien Kock是Java软件工程师。 他喜欢单口喜剧,并且曾经是街头霸王的竞争者。

IOB基准

异步ForkJoinPool,managedBlock和Quasar在IO方案中如何执行?

我认为Quarar有很大的潜力。 除了允许更多数量的并行操作之外,Quasar的光纤还允许OS线程不是一对一的映射,它还使程序员能够以同步方式(使用延续 )来编写代码。 这比普通的异步风格的代码往往会带来回调的痕迹使解释和推理代码更加容易。 对于轻量级线程的性能优势,我考虑暂停绿色线程的性能的提高/纤维与停车操作系统线程非常成熟 。 在这篇Takipi博客文章的启发下 ,我对Quasar在IO场景中的表现与替代品的表现感到好奇。 所以我做了一个基准。

新话题:Java的IO基准:类星体与异步ForkJoinPool与managedBlock http://t.co/2eoi4th2ZO pic.twitter.com/IDDGYPYvfI

— Takipi(@takipid) 2015年3月9日

设置

我使用JMH来避免重新发明测试轮的不良版本。 我首先找到了Caliper,但随后在Stackoverflow的某个地方读到JMH“更好”。 这是我第一次使用它,但这是一次非常积极的经历。 它带有事件探查器和自动参数排列以及许多其他用于编写微基准测试的出色功能。 我的基准比较了IO的三种样式。 直接使用AsynchronousFileChannel(带有回调),使用常规的阻塞FileChannel,但使用ForkJoinPool的managedBlock工具,最后:Quasar(在AsynchronousFileChannel周围使用包装器对象,使您可以编写同步样式代码)。 我使用IO操作之间的一些计算工作来运行测试,以从Quasar获得大量上下文切换。 您可以在我的Github存储库中找到基准代码。 该基准测试在Windows 8笔记本电脑上以安全模式(我知道避免干扰的最佳方式)在SSD驱动器上运行。

结果

通过5次热身迭代和15个真实样本,我相信这是非常准确的。

基准结果

差异远在误差范围之内,我相信可以肯定地说它们是相等的。 运行堆栈分析器仅显示托管阻塞和非阻塞(Quasar和Async FJP)类型之间的差异,这会产生非常不同的调用堆栈。 我创建了一个使用Socket进行相同操作的基准测试,但是我很确定实现中存在错误。 如果有人想看一下代码,请放心。

我预计托管块会变慢,因为当无法保证FJP上的并行性时,它将分配额外的线程,使用计算任务肯定是这种情况。 在运行该基准测试时,我什至无法正常启动VisualVM。 大量的线程使其加载非常缓慢。 尽管频繁分配线程,但没有区别。 类星体也是如此。 暂挂光纤的开销(保留执行进程的当前状态以释放CPU内核的操作)不会引起任何明显的延迟。 在“引人注目的”是关键的地方……

结论

面对IO,这三种实现的速度差异不明显。 我是否实现了灭火是没有关系的,因为CPU是瓶颈,因为在所有三种实现中,常规(非IO)代码都将以相同的速度和相同的并行度执行。 这是因为Quasar不会进行任何上下文切换,除非光纤实际阻塞了。 如果光纤花费太长时间执行而没有光纤阻塞,类星体甚至会发出警告。 似乎三种处理IO的性能均相同,这意味着对于这种类型的应用程序,在这三种类型之间进行选择将是一个问题。 但是,我认为这只是部分正确。 在回调样式和阻止样式之间,如果我要做的是同时处理8个文件,则可以清楚地选择阻止样式。 它更容易掌握。 接下来,在托管块(创建更多线程)和光纤块之间进行选择,托管块的工作量最少。 案件尚未完全结案,但是……

潜伏

在客户端连接可以长时间保持打开的Web服务器中(例如,当我们等待缓慢的客户端和/或正在从数据库中获取数据时),在事务期间阻塞线程可能会导致线程饥饿。 这是Quasar真正发挥作用的地方,这要归功于将许多用户空间线程复用到少量OS线程上。 然后有...

使用Quasar的(当前)“困难”

截至目前,使用quasar意味着使用Java代理,这仅需要一点努力。 现有代码也标记为@Suspendable,以便Quasar可以检测并阻止随后运行代码的光纤。 在pom.xml中查找执行发现/标记的maven-antrun-plugin。 如果您使用的是具有回调样式异步性的框架,那么您需要编写的自定义代码并不那么复杂,但是您仍然必须编写它。 看看Pulsar的现成集成。

IO光纤:是或否

当您要做的只是具有高吞吐量和低并行度的连续IO时,基准测试不会显示使用光纤的任何代价。 使用Quasar所做的额外工作(就额外的编码和配置而言)是一系列一次性任务,(在我看来)这可以忽略不计。 Pulsar提供了一组很好的集成(尽管JDBC有点不足)。 使用这些和您自己的应用程序,您可以创建一个IO繁重的应用程序(例如Web应用程序),该应用程序具有一个用于接受连接的池和一个或多个用于处理后端调用的池。 您最终得到的是线程池,这些线程在后台将任务相互传递,而您的逻辑仍然以同步的方式从上到下读取,最后是return语句。

如果像大多数小型应用程序一样,您最多只能为数百名同时进行的用户做点事情:该技术值得一试,但没有好处。 但是,如果您的应用程序需要处理大量并行请求:我说,去吧。

翻译自: https://www.javacodegeeks.com/2015/03/java-io-benchmark-quasar-vs-async-forkjoinpool-vs-managedblock.html

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

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

相关文章

WP8开发札记(一)WP8应用生命周期管理

在介绍生命周期前,我们先了解两个相关的概念。 1、墓碑机制:WP8与Android采用的真后台机制不同,WP8采用的是墓碑机制。一旦从当前应用程序离开(非退出),该应用会被墓碑化,这样可以更好的管理&am…

python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...

第8.3节Python类的__init__方法深入剖析:构造方法与继承详解一、 引言上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类没有重写构造方法,Python将会给出默认的__init__方法…

OpenShift DIY:使用Gradle构建Spring Boot / Undertow应用程序

由于此bug, Gradle 1.6是在OpenShift上运行的最后一个受支持的Gradle版本。 但是从Gradle 2.2开始,这不再是问题,因此使用自己动手做墨盒在OpenShift上运行最新的Gradle不再是问题。 DIY墨盒是一种实验性墨盒,它提供了一种在OpenS…

使用JAX-RS和Jetty创建Web服务和Rest Server

用Java创建WebService非常容易。 将其添加到ServletContainer并将其部署到嵌入式WebServer仅需要几行代码。 让我们创建一个具有两个函数的简单计算器,作为WebService的示例。 计算器将计算任何数量的squareRoot和平方。 它将返回一个简单的JSON响应,其…

maya 中使用节点连接来求余数:

绑个东西要用到求余,不喜欢用表达式,就想用节点连出来,找了下网上只有 镀金铆钉 在火星时代上的教程,不过不能下载了,就自己想了下,终于搞出来了,做下笔记,不要忘了。 求余的思路&a…

java web 登录界面案例_【JavaWeb】74:写一个登录案例

今天是刘小爱自学Java的第74天。感谢你的观看,谢谢你。话不多说,开始今天的学习:Java又常被称之为后台开发。什么叫后台呢?除了后台还有什么前台、前端后端……这些概念一大堆,还容易弄混。以一个三层架构的知识点来引…

7种JIRA集成可优化Java开发流程

有哪些最佳集成可以用来优化JIRA工作流程? 我喜欢寻找在工作流程中提高效率的方法。 看着那些小的自动化和流畅的流程,使我的脸上露出笑容。 我知道我并不孤单,偶尔花更多的时间来获得一点点提升以使其正常工作,而不是最终节省了我…

hive处理日志,自定义inputformat

开放环境,hadoop-0.20.2,hive-0.6 1.日志分隔符 Xml代码 2010-05-31 10:50:17|||61.132.4.82|||http://www.360buy.com/product/201185.html 2010-05-31 10:50:17|||61.132.4.82|||http://www.360buy.com/product/201185.html分隔符是“ ||| ”&#xf…

将ActiveMQ持久消息传递性能提高25倍

Apache ActiveMQ,JBoss A-MQ和Red Hat Apache ActiveMQ是一个非常受欢迎的开源消息传递代理,由创建(和工作) Apache Karaf , Apache Camel , Apache ServiceMix以及许多其他工具的人提供给您。 它拥有一个充…

ECMA学习小结(3)——constructor 和 prototype

每个函数都有一个prototype的属性,当我们以这个函数为构造函数创建实例时(即用new的形式),创建出来的这个对象是没有prototype的属性的。以下代码为例:在console里进行调试cf 拥有一个prototype的属性,这个…

java什么是网络接口_java 网络编程 -- IP地址的表示与网络接口信息的获取(InetAddress和NetworkInterface)...

使用java进行网络程序的开发,可以说是一件令人愉悦的事情,对于用惯了C网络接口编程的人来说,当他们首次使用Java开发网络应用程序,会发现java开发网络应用是如此的简单,甚至仅用几分钟时间,您就可以学会这种…

如何使用悲观锁定修复乐观锁定竞争条件

概括 在我以前的文章中 ,我解释了使用显式乐观锁定的好处。 然后我们发现,在很短的时间范围内,并发交易仍可以在我们当前交易被提交之前立即提交产品价格更改。 此问题可以描述如下: 爱丽丝拿产品 然后,她决定订购…

SWT外观:自定义FlatScrollBar颜色等

最近,我引入了一个自定义滑块控件 ,该控件可用于改善SWT外观和更细微的视图布局的感觉。 令人高兴的是,该小部件似乎已经在Code Affine世界之外找到了较早的采用者 。 这导致了一些增强 ,这些增强将在以下各节中介绍。 SWT滚动条…

java虚拟机编译_[四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式...

前言简介前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明想要了解JVM的运行机制,以及如何优化你的代码,你还需要了解一下,java编译器到底是如何编译你的代码的本文不是从最底层的编译原理讲解本文是针对java代码,去查看归纳总结编译…

提高性能:流的非阻塞处理

1.简介 想象一下,我们有一个需要访问外部Web服务的应用程序,以便收集有关客户端的信息,然后对其进行处理。 更具体地说,我们无法在一次调用中获得所有这些信息。 如果我们要查找不同的客户端,则需要多次调用。 如下图…

CDI和EJB:在事务成功时发送异步邮件

再一次问好! :) 这次,我选择了一项常见任务,我认为大多数情况下都以错误的方式完成:发送电子邮件。 并非所有人都不知道电子邮件API的工作方式,例如JavaMail或Apache的commons-email 。 我通常看到的一个问题是&#…

使用默认方法的界面演变–第一部分:方法

几周前,我们详细研究了默认方法 -Java 8中引入的一项功能,该功能允许为接口方法提供实现,即方法主体,从而定义接口中的行为。 引入此功能是为了实现接口演进 。 在JDK的上下文中,这意味着在不破坏所有代码的情况下向接…

java两个和三个_Java语言基础(day_03)

数据类型中补充的几个小问题1)在定义Long或者Float类型变量的时候,要加L或者f。整数默认是int类型,浮点数默认晨double。byte,short在定义的肘候,他们接收的某实是一个int类型的值。这个是自己做了一个数据检测的,如果…

在Websphere 8.0上安装Liferay 6.2 Enterprise Edition

为Liferay准备Websphere 当应用服务器二进制文件均已安装完毕,启动WebSphere应用服务器(WAS) 配置文件管理工具来创建一个配置文件适用于Liferay的和遵循的指示说明这里正式Liferay的文档。 这些说明用于在Websphere 8.5上安装Liferay 6.2&am…

java完数流程图_编程基本功训练:流程图画法及练习

对于“程序设计”的工作,许多初学者的理解就是“写代码”。同样,新手们苦恼的问题是,他们只会“写代码”。当接到一个新的任务,不少人总是在第一时间就爬到键盘上去敲代码。敲着敲着,就把自己绕糊涂了。头晕脑胀地坚持…