quasar 异步回调_Java IO基准测试:Quasar与异步ForkJoinPool与ManagedBlock

quasar 异步回调

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

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

IOB基准

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

我认为Quarar有很大的潜力。 除了允许更多数量的并行操作之外,Quasar的光纤还允许OS线程不是一对一的映射,还允许程序员以同步方式(使用continuation )编写代码。 这比普通的异步风格的代码往往会带来回调的痕迹使解释和推理代码更加容易。 对于轻量级线程的性能优势,我考虑暂停绿色线程的性能的提高/纤维与停车操作系统线程非常成熟 。 在这篇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

quasar 异步回调

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

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

相关文章

php微信自动回复机器人,微信自动回复机器人功能怎么实现?

原标题:微信自动回复机器人功能怎么实现?微信自动回复机器人功能怎么实现?最近有不少小伙伴都在询问这个问题。很多人在微信营销的过程中,都会有这样的问题,微信好友太多,想要都在第一时间回复,…

C语言怎么合并两个有序链表

C语言合并两个有序链表的方法:拼接指定的两个有序链表的所有节点即可。例如两个有序链表分别为【1->2->4】和【1->3->4】,合并后的有序链表为【1->1->2->3->4->4】。具体方法:将两个有序链表合并为一个新的有序链…

jira集成开发代码_7种JIRA集成可优化您的Java开发流程

jira集成开发代码有哪些最佳集成可以用来优化JIRA工作流程? 我喜欢寻找在工作流程中提高效率的方法。 看着那些小小的自动化和流畅的流程,我的脸上露出了微笑。 我知道我并不孤单,有时花费更多的时间来获得一点点提升以使其正常工作&#xff…

c语言源程序结构是怎样的?

一个C语言源程序至少一个有main函数,定义函数必须指定 4 个元素:返回类型、函数名、圆括号内的形参表(可能为空)和函数体。源程序的结构特点:1、一个C语言源程序可以由一个或多个源文件组成。2、每个源文件可由一个或多…

c语言规定在一个源程序中main函数的位置是什么?

一个c程序有且仅有一个main函数,除main函数之外可以有若干个其它的函数,每个函数实现某一特定的操作。C语言规定,在一个源程序中,main函数的位置可以任意。因为:在一个C语言源程序中,程序总是从main函数开始…

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

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

可运行的c语言程序的扩展名为什么?

C语言源程序经过C语言编译程序编译之后,生成一个后缀为“.OBJ”的二进制文件(称为目标文件),最后还要由称为“连接程序”(link)的软件,把此“.OBJ”文件与c语言提供的各种库函数连接在一起,生成一个后缀“.EXE”的可执行文件。显然…

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

activemq消息持久化Apache ActiveMQ,JBoss A-MQ和Red Hat Apache ActiveMQ是一个非常受欢迎的开源消息传递代理,由创建(和从事) Apache Karaf , Apache Camel , Apache ServiceMix以及许多其他工具的人提供…

c语言实现两个有序链表的合并(代码示例)

c语言实现两个有序链表的合并:现有两个有序单链表,通过代码实现将两个单链表合并为一个有序的新表,要求使用旧表的空间,不能新分配内存#include #include typedef struct List{ int a; struct List *next;}list;void newLis…

hibernate工厂模式_Hibernate锁定模式–乐观锁定模式如何工作

hibernate工厂模式显式乐观锁定 在上一篇文章中 ,我介绍了Java持久性锁定的基本概念。 隐式锁定机制可防止丢失更新 ,它适用于我们可以主动修改的实体。 尽管隐式乐观锁定是一种广泛使用的技术,但很少有人了解显式乐观锁定模式的内部工作原理…

using用法是什么?

using用法是:1、命名空间using namespace 命名空间;//这样每次使用命名空间中的变量时就不用指定命名空间了注意:头文件中不应有using命名空间的声明2、类型别名(C 11)using aa double;//等价于typedef double aatypedef double …

学习C ,常见的误解

学习C 你是否会有以下几点误解?1. “要理解C ,你必须先学习C”2. “C 是一门面向对象的语言”3. “为了软件可靠性,你需要垃圾回收”4. “为了效率,你必须编写底层代码”5. “C 只适用于大型、复杂的程序”如果你中*了&#xff0c…

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

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

php管理智能dns,负载均衡之DNS轮询

域名注册商都支持对统一主机添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡。下图的例子是:有3台联通服务器、3台电信服务器,要实现“…

php怎么把时间戳转成日期格式,php怎么把时间格式转换为时间戳?,时间戳转为日期...

php怎么把时间格式转换为时间戳?PHP怎么把时间格式转换成时间戳?,php时间格式转换为时间戳的方法:1。使用mktime()将时间转换为时间戳,语法为“mktime(小时、分钟、秒、月、日、年)”;2.使用strtime()将字符…

C语言的标识符由什么组成

C语言的标识符由字母、数字、下划线组成,并且第一个字符必须是字母或下划线,不能是数字。在标识符中,字母的大小写是有区别的,例如BOOK与book是两个不同的标识符。定义变量时,我们使用了诸如 a、abc、mn123 这样的名字…

jdk8读取文件_JDK 7和JDK 8中大行读取速度较慢的原因

jdk8读取文件我早些时候发布了博客文章Reading Large Lines Slower in JDK 7和JDK 8,并且在描述该问题的文章上有一些有用的评论 。 这篇文章提供了更多解释,说明为何该文章中演示的文件读取(并由Ant的LineContainsRegExp使用 )在…

C 11 实现的 100行 线程池

C 线程池一直都是各位程序员们造轮子的首选项目之一。今天,小编带大家一起来看看这个轻量的线程池,本线程池是header-only的,并且整个文件只有100行,其中C 的高级用法有很多,很值得我们学习,一起来看看吧。…

openshift使用_OpenShift v3:使用WildFly和MySQL的Java EE 7入门

openshift使用OpenShift是Red Hat的开源PaaS平台。 OpenShift v3 (将于今年发布)将提供使用Docker和Kubernetes运行微服务的整体体验。 以经典的Red Hat方式,所有工作都在OpenShift Origin的开源中完成。 这也将推动OpenShift Online和OpenSh…

c程序的基本组成单位是什么?

C程序是由函数构成的。函数是C程序的基本组成单位。一个C源程序中仅有一个main()函数,除main函数之外可以有若干个其它的函数。每个函数实现某一特定的操作。因此,函数是C程序的基本单位。一个函数由两部分组成:函数的说明部分。包括函数名、函数类型、函…