quasar 异步回调

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

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

异步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 异步回调

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

  1. java 异步模型_Java IO编程全解(三)——伪异步IO编程

    为了解决同步阻塞I/O面临的一个链路需要一个线程处理的问题,后来有人对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数M:线程池最大线程数N的比例关系,其中M可以远 ...

  2. java登录时启动后台异步线程_JAVA多线程的同步和 异步

    原标题:JAVA多线程的同步和 异步 1.多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为多线程和异步操作是等同的概念.但是 ...

  3. JAVA异步爬虫_Java 爬虫遇上数据异步加载,试试这两种办法!

    这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...

  4. java微信支付异步通知_Java中微信支付退款异步通知解码

    微信所有的支付结果都是加密处理的,他和订单支付成功的异步通知不一样. 他的基本返回是: SUCCESS 我们需要对req_info解码才能看到退款的明文 解码后会得到明文: 解密步骤如下: (1)对加 ...

  5. C# 委托的三种调用示例(同步调用 异步调用 异步回调)

    首先,通过代码定义一个委托和下面三个示例将要调用的方法: 复制代码 代码如下: public delegate int AddHandler(int a,int b);     public clas ...

  6. C#(同步调用、异步调用、异步回调)

    本文将主要通过"同步调用"."异步调用"."异步回调"三个示例来讲解在用委托执行同一个"加法类"的时候的的区别和利弊. ...

  7. C#“同步调用”、“异步调用”、“异步回调”

    本文将主要通过"同步调用"."异步调用"."异步回调"三个示例来讲解在用委托执行同一个"加法类"的时候的的区别和利弊. ...

  8. C# 委托(同步调用、异步调用、异步回调)

    文章转自:http://www.csharpwin.com/csharpspace/12393r3151.shtml 本文将主要通过"同步调用"."异步调用". ...

  9. WPF如何获得变量异步回调函数时产生的异步回调

    有这样的问题,WPF当使用异步回调,需要使用产生的异步变量中的回调函数.数据库中查询诸如异步函数来获得一DataTable.怎样传递给回调函数呢? [方案一]使用全局变量 非常easy想到的是用全局变 ...

最新文章

  1. Windows 8下看漫画的程序发布
  2. angr学习笔记(6)(内存地址单元符号化)
  3. 2016年10月起微软更改了更新服务模型
  4. 六个iPhone6不会火爆的理由
  5. CentOS 初体验一:VMWare 安装 CentOS
  6. 云效走进百所高校 让上千学生真正认识代码
  7. 你可能还不知道的关于JavaScript类型的细节?
  8. dax powerbi 生成表函数_如何用Power BI对数据建模?
  9. python middle()_python学习——基础(四)
  10. XenApp / XenDesktop 7.6 初体验一   安装, 配置站点和序列号服务器
  11. Java内存监控程序_java内存监控工具及命令
  12. 比较一下 淘宝、易趣、拍拍、百度有啊
  13. jQuery封装的获取Url中的Get参数
  14. 网络游戏广告植入案例
  15. Vue-amap 实现获取定位功能
  16. 6.18上午CVPR直播 | 清华三维视觉研究团队:三维人体重建与渲染、高精度人脸生成
  17. (病毒安全)任何杀毒软件都不能用了
  18. 请详细解释下小波去噪的原理
  19. CSS3中的一些新特性(CSS)
  20. 富士x-e4参数 怎么样?测评值得买吗?

热门文章

  1. P4196-[CQOI2006]凸多边形/[模板]半平面交【计算几何】
  2. P5895-[IOI2013]dreaming梦想【树的直径,结论】
  3. P3225-[HNOI2012]矿场搭建【tarjan,图论】
  4. USACO2.2【统计,dp,模拟,位运算】
  5. P1967,ssl2267-货车运输【树上倍增LCA,最小生成树变形kruskal】
  6. jzoj1373-食物链【并查集】
  7. ssl1624-小萨的烦恼【图论,最短路,Floyd】
  8. ssl1104-USACO 2.1城堡(foodfill)【图论,广搜】
  9. 【DP】字串距离(luogu 1279)
  10. P1081 开车旅行 倍增 洛谷