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针对不同大小的双精度值数组所花费的时间如下所示:
列表也有类似的实现,并且列表上的许多操作具有并行的等效项。
翻译自: https://www.javacodegeeks.com/2013/04/arrays-sort-versus-arrays-parallelsort.html
Arrays.sort与Arrays.parallelSort相关推荐
- bucket sort sample sort 并行_Java 中 Arrays.sort 和 Arrays.parallelSort 哪个更快?
1. 概述 我们都使用过 Arrays.sort() 对对象或原始数据类型数组(byte,short,int,long,char,float,double和boolean)进行排序.在 JDK 8 中 ...
- java8 Arrays.sort 与Arrays.parallelSort
java8 Arrays.sort 与Arrays.parallelSort Sort方法 java8中Arrays.sort()方法有很多重载方式,先来看看对byte类型的排序 static voi ...
- 深入学习java源码之 Arrays.sort()与Arrays.parallelPrefix()
深入学习java源码之 Arrays.sort()与Arrays.parallelPrefix() Comparator接口 能对不同类型的对象进行排序(当然排序依据还是基本类型),也不用自己实现排序 ...
- Arrays.sort与Arrays.parallelSort区别
概述 我们都使用过 Arrays.sort() 对对象或原始数据类型数组(byte,short,int,long,char,float,double和boolean)进行排序.在 JDK 8 中,创造 ...
- arrays.sort(._Arrays.sort与Arrays.parallelSort
arrays.sort(. 我们都使用Arrays.sort对对象和原始数组进行排序. 此API在下面使用合并排序或Tim排序对内容进行排序,如下所示: public static void sort ...
- Java的Arrays.sort()良心总结
C语言的stilib.h头文件中有qsort(),C++的STL库中有sort(),这些封装好的排序函数让我们避免了比赛手写排序,给我们解题带来了的便利.在Java的Arrays类中也封装好了类似的方 ...
- Java中的Arrays.sort(int[])
Arrays.sort(int[]) Arrays.sort(int[])使用的是quicksort+merge sort. 使用quicksort:当数组长度比较小(right-left<28 ...
- 更高效地刷OJ——Java中常用的排序方法,Array.sort(),Arrays.parallelSort(), Collections.sort()
对于几大传统的排序算法我在前面博客中已经介绍过了,如果有想要了解的同学可以去看这篇博客八大排序:冒泡排序,选择排序,插入排序,堆排序,希尔排序,归并排序,计数排序但是我们在刷题过程中如果题目中没有对排 ...
- Java数组排序: Array-ArrayList-List-Collections.sort()/List.sort()/Arrays.sort()
文章目录 ArrayList/List 的排序:Collections.sort()/List.sort() Array 的排序:Arrays.sort() 此文首发于我的Jekyll博客:zhang ...
最新文章
- 渗透测试:正义黑客的渗透测试以及该过程和黑客活动的区别
- mysql blob 比较_MySQL下,text 、blob的比较
- 【NLP】NLP重铸篇之Fasttext
- s6-8 TCP 拥塞控制
- 优化 .NET Core logging 中的泛型 logger
- iOS 两个tableview的 瀑布流
- python绘制如下图形、小三角形边长20_python二级操作题与分析(7)
- 【AI参赛经验】汉字书法识别入门—by:真的学不会
- 同步机构应遵循哪些基本准则
- HDU 1002 A+BII大数
- (19)一篇掌握MySQL数据库基础下 基本操作(外键约束、建表原则、多表查询、子查询)
- ruby-to_ary
- git 修改倒数二个 commit
- 用javascript编写的小游戏-打砖块
- 浅谈运营商线路-----TDM、SDH、MSTP,OTN
- 网络原理与交换机路由器应用
- C盘空间不足怎么办,如何让C盘获得更多空间
- Linux命令 - rmdir命令
- 使用unity制作简单的VR时打包APK出现的几个问题
- Aleo创始人Howard Wu:我们如何理解Aleo项目
热门文章
- 直方图 帕累托图_如何发现现象背后的关键因素?帕累托图,质量管理的利器...
- 查看oracle会话和进程_带有Oracle Digital Assistant和Fn Project的会话式UI
- junit 验证日志输出_JUnit规则–引发异常时执行附加验证
- 光盘 机密_使用保险柜管理机密
- 2015年传智播客java_2015年Java 8强势开始
- 数据库连接配置tomcat_Tomcat到Wildfly:配置数据库连接
- 通过SSL发送的Java邮件
- 谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!
- IBM将收购Red Hat:面向Java的初衷
- Java机器学习,第2部分