forkjoin_应用ForkJoin –从最佳到快速

forkjoin

到目前为止,JDK 7已很好地掌握在开发人员手中,并且大多数人都听说过ForkJoin,但是没有多少人有时间或机会去尝试它。

它引起了并且可能仍然引起一些混乱,与普通线程池有什么不同。 [1]

我在本文中的目标是通过一个代码示例来呈现一个更复杂但仍然简单的ForkJoin使用示例。

我计时并测量串行线程池ForkJoin方法的性能

这是github的前期内容: https : //github.com/fbunau/javaadvent-forkjoin

实际问题

想象一下,我们的系统中有某种组件可以在每毫秒时间内保持股票的最新价格。

这可以作为整数数组保存在内存中。 (如果我们以bps为单位)

该组件的客户进行如下查询:价格最低的是time1time2之间的时间点?

这可以是自动算法,也可以只是GUI中进行矩形选择的人。

stock_chart2

示例图像中有7个查询

让我们还想象一下,我们从一个Task中批处理的客户端中获得了许多这样的查询。

可以将它们分批处理,以减少网络流量和往返时间。
我们有组件可能获得的不同大小的任务,最多10个查询(带有GUI的人),最多100个,..最多1 000 0000个(某种自动化算法)。 我们的组件有很多这样的客户,每个客户都会产生不同大小的任务。 请参阅Task.TaskType

核心问题与解决方案

我们必须解决的核心问题是RMQ问题。 这是维基百科[2] :

“鉴于从一组有序集合(例如数字)中提取的对象数组,从ij的范围最小查询(或RMQ)要求最小元素在子数组A[i, j] ”。

“例如,当A = [0, 5, 2, 5, 4, 3, 1, 6, 3]时,则A[3, 8] = [2, 5, 4, 3, 1, 6]的范围最小查询的答案A[3, 8] = [2, 5, 4, 3, 1, 6]7 ,因为A[7] = 1

存在用于解决此问题的有效数据结构,称为“细分树”。

我不会对此进行详细介绍,因为这篇经典的Topcoder文章[3]对此进行了很好的介绍。 这本身对于这个ForkJoin示例并不重要,我之所以选择它是因为它比简单的总和更有趣,并且其本质是基于fork-join的精神。 它划分要计算的任务,然后将其加入结果!

数据结构具有O(n)初始化时间和O(log N)查询时间,其中N是每个时间单位值数组的价格中的元素数量。
因此,任务T包含M要进行的查询。

在学术计算机科学方法中,您只是说我们将使用这种高效的数据结构处理每个任务,而复杂性将是:

式
您再没有比这更有效率的了! 是的,在理论上是冯·诺依曼机器上的,但实际上可以。

一个容易引起混淆的是,因为O(n/4) == O(n) ,所以在编写程序时,常数因子不计算在内,但确实如此!
停下来想一想,等待10或40分钟/小时/年是否一样?

平行进行

因此,考虑要解决的问题,我们如何才能使其更快? 由于现在每个计算设备都有更多的计算核心,因此让我们充分利用它们并立即执行更多操作。
我们可以使用Fork Join框架轻松地做到这一点。

我最初很想尝试一下RMQ数据结构并并行执行它的操作。 我攻击了本来已经是log N的东西。但这是一个很大的失败,对于调度程序来说,管理如此短时间的逻辑开销太大。

答案是最终攻击的M_i常数因子。

线程池

在介绍如何应用ForkJoin解决方案之前,让我们想象一下如何应用线程池。 请参阅: TaskProcessorPool.java

图形2

我们可以有一个由4个工作人员组成的池,当我们有一个任务要做时,我们将其添加到队列中。 一旦有工作人员可用,它将从队列的开头检索待执行的任务,然后执行该任务。

虽然这对于具有相同大小的任务是很好的,并且大小相对中等且可预测,但是当要执行的任务大小不同时,就会遇到问题。 一名工人可能会因长期运行的任务而烦恼,而其他工人则无所事事。

在此图像中,如果不将更多任务添加到队列中,则线程池将在4个时间单位内完成16个可能的工作单位中的9个(效率为56%)

叉连接

当您位于问题域中时,可以将要解决的任务拆分为较小的任务,因此前叉联接很有用。

fork-join池的特殊之处在于它是一个窃取工作的线程池。

每个辅助线程都维护任务的本地出队。 在执行新任务时,可以执行以下任一操作:

  • 将任务拆分为较小的任务
  • 如果任务足够小,则执行任务

当一个线程的出队中没有本地线程时,它将“窃取”,从另一个随机线程的队列后面弹出任务,并将其放在自己的线程中。 此任务尚未拆分的可能性很高。 因此,他将有很多工作要做。

与线程池相比,它们可以将现有任务拆分为较小的线程,而不是等待其他线程等待某些新工作,并帮助另一个线程处理较大的任务。

图形1

这是Doug Lea的原始论文,提供了更详细的解释: http : //gee.cs.oswego.edu/dl/papers/fj.pdf

回到我们的示例中,可以将一大批操作分成几批较少数量的操作。 参见: TaskProcessorFJ.java

大多数问题具有像这样的线性操作序列,它不一定是特殊的并行问题,对此我们需要应用专门的并行算法来利用处理器上的核心。

你分多少钱? 您拆分任务,直到达到通常不再有意义的阈值为止。 例子:(拆分+获得工作的线程+上下文切换比实际执行任务要多)

对于大型XXL,我们必须执行1000000个查询操作。 我们可以将其分为2 500000个操作任务,并并行执行。 500000仍然很大吗? 是的,我们可以进一步拆分。 我选择了一组10000个操作作为阈值,在该阈值下没有任何拆分用途,我们可以在当前线程上执行它们。

Fork join并不会拆分所有任务,而是通过它进行工作。

绩效结果

在干净重启后,我对i5-2500 CPU @ 3.30GHz上具有4核/ 4线程的i5-2500 CPU的每个处理器实现进行了4次迭代。
结果如下:

Doing 4 runs for each of the 3 processors. Pls wait ...
TaskProcessorSimple: 7963
TaskProcessorSimple: 7757
TaskProcessorSimple: 7748
TaskProcessorSimple: 7744
TaskProcessorPool: 3933
TaskProcessorPool: 2906
TaskProcessorPool: 4477
TaskProcessorPool: 4160
TaskProcessorFJ: 2498
TaskProcessorFJ: 2498
TaskProcessorFJ: 2524
TaskProcessorFJ: 2511
Test completed.

结论

即使您选择了正确的最佳数据结构,它也不会很快,直到您使用所有的资源。 即利用所有核心

在某些问题域中,ForkJoin绝对是对线程池的改进,值得探索在哪里可以应用它,我们将看到越来越多的并行代码。
您今天可以购买这种处理器 ,即12核/ 24线程。 现在,我们只需要编写软件来利用我们拥有的,将在将来获得的出色硬件即可。

代码在这里: https : //github.com/fbunau/javaadvent-forkjoin如果您想使用它的话

感谢您的宝贵时间,如果发现任何错误或需要添加的内容,请留下一些评论。

参考: Java出现日历博客上的JCG合作伙伴 Attila Mihaly Balazs 从最佳到快速的应用ForkJoin 。

翻译自: https://www.javacodegeeks.com/2013/12/applying-forkjoin-from-optimal-to-fast.html

forkjoin

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

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

相关文章

android usb触摸屏驱动 win10,Win10手机居然这样兼容安卓:直接运行apk!

摘要:“应用太少是硬伤!”这是WP粉吐槽微软简洁而有力的一句话。最新的Win10Mobile预览版中首次引入了微软的安卓子系统,这也是微软推行的ProjectAstoria的一部分。那么Win10手机究竟要如何兼容安卓应用呢?微软最新一份招聘启事似…

GSM、UMTS、LTE

GSM 全球移动通信系统(Global System for Mobile Communications) ,由欧洲电信标准组织ETSI制订的一个数字移动通信标准。它的空中接口采用时分多址技术。自90年代中期投入商用以来,被全球超过100个国家采用。GSM标准的无处不在使得在移动电话运营商之间…

Java应用程序中的验证

我经常看到的项目几乎没有任何有意识的数据验证策略。 他们的团队在截止日期,明确要求的巨大压力下工作,只是没有足够的时间以适当且一致的方式进行验证。 因此,数据验证代码随处可见:JavaScript片段,Java屏幕控制器&a…

android daemon 程序,(转)Android App Daemon

一直没空把App Daemon的原理整理一下,见不少人在问原理,我这里就把整个流程大概的说一下。关于进程守护,从接触Android没多久就一直想实现,网上给出的方案也是各种各样,有双服务方式,有利用系统定时器方式的…

什么是卫星的有效载荷?

直接执行特定卫星任务的仪器、设备或分系统就是卫星的有效载荷。 有效载荷是指航天器上装载的为直接实现航天器在轨运行要完成的特定任务的仪器、设备、人员、试验生物及试件等。 有效载荷的种类很多,即使是同一种类型的有效载荷,性能差别也很大。 返回型…

升级鸿蒙系统如何退出,华为鸿蒙2.0系统升级了怎么退回EMUI11系统-操作教程详解...

华为鸿蒙2.0系统升级了怎么退回EMUI11系统?很多用户升级了又不知道如何才能退回到原来的系统,下面就让老铁下载小编为大家带来,2.0系统升级退回EMUI11系统操作教程详解。这次开启华为鸿蒙2.0系统手机开发者beta版公测招募的机型有华为P40 、P…

OpenFlow和SDN的历史和原理介绍

OpenFlow相关的历史、新闻:http://blog.csdn.net/jincm13/article/details/7825754 起源与发展 【https://36kr.com/p/5035985】   OpenFlow起源于斯坦福大学的Clean Slate项目组 [1] 。CleanSlate项目的最终目的是要重新发明英特网,旨在改变设计已略…

可见性得以保障,并不意味着_战略模式并不意味着春天!

可见性得以保障,并不意味着是的,所以可以说您正在编写一个Spring MVC应用程序,然后您决定:“我想做一些单独的封装算法,这些算法可以互换来执行特定的行为”。 对此的经典回应是“您需要一个战略模式男孩!”。 所以&a…

小米miuiVS华为鸿蒙,华为鸿蒙2.0 vs 小米MIUI 12.5

原标题:华为鸿蒙2.0 vs 小米MIUI 12.5不久前有媒体在视频中展示了鸿蒙2.0和苹果IOS14两个操作系统下App的启动速度,结果是鸿蒙2.0完胜IOS14。此后不久,该媒体发布了华为鸿蒙2.0和小米MIUI 12.5对比视频。同上次一样,这次依然是选择…

传播时延(propagation delay)与发送时延(transmission delay)

原文: http://wzw19191.blog.sohu.com/135110823.html 传播时延(propagation delay)这个概念,是指电磁信号或者光信号在传输介质中传输的时延,而在光纤或者铜线中,光信号和电磁信号的传播速度都在20万公里/秒以上,在传…

具有MicroProfile配置的可配置JAX-RS ExceptionMapper

当您使用JAX-RS创建REST服务时,通常要么不返回任何内容(例如HTTP 201/2/4等),要么返回某些数据(可能采用JSON格式(因此HTTP 200),或者返回某些异常/错误(例如HTTP 4xx或5…

video.js android,VideoJS + HTML5自动播放失败,适用于Android 2.3+和IOS 4+

我的VideoJS和HTML5项目针对更新的Web浏览器(较新版本的FireFox和Chrome)以及移动浏览器(Android2.3 和IOS4 )。VideoJS HTML5自动播放失败,适用于Android 2.3和IOS 4我希望所有视频在“准备就绪”之后自动播放。我尝试了几种方法(在下面的方法中提到过)&#xff0…

EPS(Evolved Packet System,演进的分组系统)

EPS(Evolved Packet System,演进的分组系统)是3GPP标准委员会在第4代移动通信中出现的概念。可以认为EPSUE(User Equipment,用户设备)LTE(4G接入网部分)EPC(Evolved Pack…

lottie android min sdk,跳一个Lottie无法回调开始播放动画事件的坑

一、背景介绍项目背景是在界面中弹出一个浮层动画,同时播放一个音效。二、当前实现实现思路比较简单:继承一个DialogFragment,在相关的生命周期方法onViewCreated中调用startLottieAnim进行动画播放,同时监听lottie动画播放的回调…

Ad-hoc

Ad-hoc这个词来源于拉丁语,在百度上解释为“for this purpose only”,在wiki上解释为“for this”,其中文在wiki上被解释成包含特设的、特定目的的(地)、即席的、临时的、将就的、专案的”这么多种含义。在wireless ne…

掌握Java 11的Constantdynamic

为了使JVM对动态语言更具吸引力,该平台的第七版已将invokedynamic引入了其指令集。 Java开发人员通常不会注意到此功能,因为它隐藏在Java字节码中。 简而言之,通过使用invokedynamic ,可以将方法调用的绑定延迟到第一次调用之前。…

android5.0 v4a,【图】多图讲解V4A提高G5音效详细步骤(G5音效可以更棒的)

首先感谢论坛前辈,看着你们介绍的方法,我把G5应有的音效搞出来了,效果提升非常明显。(看清了,如果不是非常明显,我也不会费这么大劲在这儿做讲解)。特记录和总结过程如下:1. 安装一键ROOT。2. 安装虚拟按…

feeder link

feeder link: 从一个设在指定的固定点上的地球站到一个空间站,或从一个空间站到一个设在某固定点的地球站的无线电链路,用于除卫星固定业务以外的空间无线电通信业务的

2021年春季学期期末统一考试 中国法制史 试题

2021年7月 一、单项选择题(每小题2分,共20分) 1.商朝法律制度的总称叫做( )。 A.禹刑 B.汤刑 C.汤诰 D.九刑 2.战国时期改“法”为“律”的人是( )。 A.韩非 B.赵鞅 C.商鞅 D.屈原 3.秦始皇和李斯等人取消了世卿世禄分封制,在全国…

怎么在html中加入pjax,pjax加载多说的三种方法

多说官方提供的方法:http://dev.duoshuo.com/docs/50b344447f32d30066000147这里不进行说明,请进入上述链接进行查看。效果说明:进入文章页需要点击按钮,多说评论才会加载出来。方法二民间高手不满足方法一那种需要按一次才能加载…