Arrays.sort与Arrays.parallelSort

我们都使用Arrays.sort对对象和原始数组进行排序。 该API在下面使用合并排序或Tim排序对内容进行排序,如下所示:

public static void sort(Object[] a) {if (LegacyMergeSort.userRequested)legacyMergeSort(a);elseComparableTimSort.sort(a);
}

即使合并排序使用分而治之技术,所有这些操作都是顺序执行的。 Java 8来了,引入了一个新的API Arrays#parallelSort用于排序。 这是并行进行的排序。 有趣的权利! 让我们看看它是如何做的...

Arrays#parallelSort使用Java 7中引入的Fork / Join框架将排序任务分配给线程池中可用的多个线程。 这被称为吃自己的狗粮 。 Fork / Join实现了一种工作窃取算法,该算法在空闲线程中可以窃取在另一个线程中排队的任务。

Arrays#parallelSort的概述:

该方法使用阈值,并且使用Arrays#sort()API对小于该阈值的任何大小的数组进行排序(即顺序排序)。 并根据机器的并行性,数组大小计算阈值,并计算为:

private static final int getSplitThreshold(int n) {int p = ForkJoinPool.getCommonPoolParallelism();int t = (p > 1) ? (1 + n / (p << 3)) : n;return t < MIN_ARRAY_SORT_GRAN ? MIN_ARRAY_SORT_GRAN : t;
}

一旦决定是对数组进行并行还是串行排序,现在就决定如何将数组分为多个部分,然后将每个部分分配给一个Fork / Join任务,该任务将负责对它进行排序,然后再进行另一个Fork /连接任务,将合并合并的数组。 JDK 8中的实现使用以下方法:
–将阵列分为4部分。
–排序前两个部分,然后将它们合并。 –对接下来的两个部分进行排序,然后将它们合并。 并且对每个零件递归地重复上述步骤,直到要分类的零件的尺寸不小于上面计算的阈值。

一些有趣的结果:

我试图比较Arrays#sort和Arrays#parallelSort在具有4个CPU的计算机上花费的时间。 我用于此比较的程序是:

public class ArraysParallelDemo {public static void main(String[] args) throws FileNotFoundException {List<Double> arraySource = new ArrayList<>();Scanner reader = new Scanner(ClassLoader.getSystemResourceAsStream("java8demo/large_array_input"));while(reader.hasNext()){String line = reader.nextLine();String[] strNums = line.split(",");for ( String strN : strNums){arraySource.add(Double.parseDouble(strN));}}System.out.println(arraySource.size());Double [] myArray = new Double[1];myArray = arraySource.toArray(myArray);long startTime = System.currentTimeMillis();Arrays.sort(myArray);long endTime = System.currentTimeMillis();System.out.println("Time take in serial: "+(endTime-startTime)/1000.0);Double [] myArray2 = new Double[1];myArray2 = arraySource.toArray(myArray);startTime = System.currentTimeMillis();Arrays.parallelSort(myArray2);endTime = System.currentTimeMillis();System.out.println("Time take in parallel: "+(endTime-startTime)/1000.0);}
}

每个API针对不同大小的双精度值数组所花费的时间如下所示:
Table_ParallelSort2
Graph_ParallelSort2

列表也有类似的实现,并且列表上的许多操作具有并行的等效项。

参考:来自Experiences Unlimited博客的JCG合作伙伴 Mohamed Sanaulla的Arrays.sort与Arrays.parallelSort 。

翻译自: https://www.javacodegeeks.com/2013/04/arrays-sort-versus-arrays-parallelsort.html

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

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

相关文章

了解ASP.NET MVC的基本架构

MVC&#xff0c;Model – View – Controller 的简写 Model 封装业务逻辑相关的数据及对数据的处理方法 View 向用户提供交互界面 Controller 负责控制Model和View 首先建立一个模板 在这里发现了一个问题&#xff08;好像vs12没有模板&#xff0c;建不出来&#xff09; 其…

Google Chrome 浏览器JS无法更新解决办法

JS无法更新原因&#xff1a; 浏览器为了加载快&#xff0c;默认是按照自定规则更新缓存&#xff0c;非实时更新。 我们在开发的时候&#xff0c;JS变动很快&#xff0c;需要即时让浏览器加载最新文件&#xff0c;也就是禁用浏览器缓存 &#xff08;1&#xff09;使用F12进入…

HDU3415 Max Sum of Max-K-sub-sequence

题意given a circle sequence A[1],A[2],A[3]......A[n]. Circle sequence means the left neighbour of A[1] is A[n] , and the right neighbour of A[n] is A[1]. Now your job is to calculate the max sum of a Max-K-sub-sequence. Max-K-sub-sequence means a continuou…

Spring:自动接线或不自动接线

从使用Spring 2.5开始&#xff0c;我从基于XML的应用程序上下文切换到了注释。 尽管我发现那些非常有用且节省大量时间的人&#xff0c;但我始终觉得在灵活性方面我失去了一些东西。 特别是Autowired批注-或标准Inject-在我看来就像新的“新”&#xff0c;增加了类之间的耦合&a…

刷题总结——Cut the Sequence(POJ 3017 dp+单调队列+set)

题目&#xff1a; Description Given an integer sequence { an } of length N, you are to cut the sequence into several parts every one of which is a consecutive subsequence of the original sequence. Every part must satisfy that the sum of the integers in the …

java crud事件回调_java回调机制 - 神是到着念的个人空间 - OSCHINA - 中文开源技术交流社区...

软件模块之间总是存在着一定的接口&#xff0c;从调用方式上&#xff0c;可以把他们分为三类&#xff1a;同步调用、回调和异步调用。同步调用是一种阻塞式调用&#xff0c;调用方要等待对方执行完毕才返回&#xff0c;它是一种单向调用&#xff1b;回调是一种双向调用模式&…

CSS盒子的浮动

在标准流中&#xff0c;一个块级元素在水平方向会自动伸展&#xff0c;直到包含它的元素的边界&#xff1b;而在竖直方向和兄弟元素依次排列&#xff0c;不能并排。使用“浮动”方式后&#xff0c;块级元素的表现就会有所不同。 CSS中有一个float属性&#xff0c;默认为no…

servlet中url-pattern之/与/*的区别

转载于:https://www.cnblogs.com/hwgok/p/8835350.html

很少使用“ ControlFlowException”

控制流是命令式编程的“遗留物”&#xff0c;它已泄漏到其他各种编程范例中&#xff0c;包括Java的面向对象范例 。 除了有用的和无处不在的分支和循环结构外&#xff0c;还包括原语&#xff08;例如GOTO&#xff09;和非局部变量&#xff08;例如异常&#xff09;。 让我们仔细…

java的if里有多个if_代码里写很多if会影响效率吗?

看你怎么写 if.嵌入很多层if的代码叫做“箭头代码”&#xff0c;是一个anti-pattern。 这种代码会增加程序的循环复杂度 (Cyclomatic complexity)具体可以看这里&#xff1a;Flattening Arrow Code这里&#xff1a;总的来说&#xff0c;程序里用if-else是有开销的。每次conditi…

python基础总结(6)

一、模块。 一个模块就是一个python文件&#xff0c;.py文件。 需要注意的是&#xff1a;自己创建模块时要注意命名&#xff0c;不能和Python自带的模块名称冲突。例如&#xff0c;系统自带了sys模块&#xff0c;自己的模块就不可命名为sys.py&#xff0c;否则将无法导入系统自…

[10.10模拟] water

题意&#xff1a; 有一块矩形土地被划分成 n*m 个正方形小块。这些小块高低不平,每一小块都有自己的高度。水流可以由任意一块地流向周围四个方向的四块地中,但是不能直接流入对角相连的小块中。一场大雨后,由于地势高不同,许多地方都积存了不少降水。给定每个小块的高度,求每个…

使用Amazon Web Services(EC2)

正如我上周参加技术动手AWS培训之前所发布的。 这些天的课程当然是我以前使用过的标准EC2和S3服务。 除此之外&#xff0c;我们还使用了RDS &#xff0c; Elastic Load Balancing &#xff0c; SNS和VPC &#xff0c; Elastic Beanstalk并讨论了许多术语和业务案例。 在本文中&…

java整型和浮点型_Java基本的程序结构设计 整形和浮点型

整形&#xff1a;int 4字节short 2字节long 8字节byte 1字节int的大小差不多是20亿。整形计算如果两个int进行加减乘除数学运算的时候&#xff0c;最终的结果仍然是int&#xff0c;有可能出现了溢出&#xff0c;那么结果就不是我们想要的了。如下&#xff1a;System.out.printl…

盒子模型阴影设置,爱奇艺阴影配置

box-shadow的配置阴影 ul li:hover{ border-color: #dfdfdf; border-radius: 10px; -moz-box-shadow: 0 5px 5px rgba(0, 0, 0, 0.1), 0 0 10px 0 rgba(0, 0, 0, 0.2); -webkit-box-shadow: 0 5px 5px rgba(0, 0, 0, 0.1), 0 0 10px 0 rgba(0, 0, 0, 0.2); box-shadow: 0 5px 5…

Linux在线扫描热添加的SCSI/iSCSI设备

SCSI接口具有应用范围广、多任务、带宽大、CPU占用率低&#xff0c;以及热插拔等优点&#xff0c;在服务器中广泛的应用。 当然在虚拟化平台支持下&#xff0c;也能模拟出SCSI设备&#xff0c;方便在虚拟机上热添加SCSI设备&#xff08;一般是硬盘&#xff09; 但是在热添加SCS…

第四周PSP

1.本周PSP 2.本周进度条 3.本周累计进度图 代码积累折线图 博文字数积累折线图 4.本周PSP饼状图 转载于:https://www.cnblogs.com/yuanyue-nenu/p/7648565.html

适用于JDeveloper 11gR2的Glassfish插件

众所周知&#xff0c; ADF Essentials是使用Java构建Web应用程序的绝佳框架&#xff0c;它可以自由开发和部署。 您可以在Glassfish&#xff08;3.1&#xff09;服务器上部署ADF Essentials应用程序。 但是&#xff0c;JDeveloper并不带有嵌入式Glassfish服务器&#xff0c;而是…

java 李刚 pdf_Java数据库技术详解(李刚) PDF_源雷技术空间

资源名称&#xff1a;Java数据库技术详解(李刚) PDF第一篇 数据库基础篇第1章 Java和数据库 21.1 Java概述 21.1.1 跨平台性 21.1.2 面向对象 21.1.3 安全性 31.1.4 简单性 31.1.5 健壮性和自动内存管理 31.2 Java的开发和运行环境 31.2.1 JDK的安装 31.2.2 配置JDK的环境变量 …

html css3模拟心的跳动

<!DOCTYPE html> <html> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><title>模拟心的跳动</title> </head> <style type"text/css">* {m…