我们都使用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针对不同大小的双精度值数组所花费的时间如下所示:

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

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

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

Arrays.sort与Arrays.parallelSort相关推荐

  1. bucket sort sample sort 并行_Java 中 Arrays.sort 和 Arrays.parallelSort 哪个更快?

    1. 概述 我们都使用过 Arrays.sort() 对对象或原始数据类型数组(byte,short,int,long,char,float,double和boolean)进行排序.在 JDK 8 中 ...

  2. java8 Arrays.sort 与Arrays.parallelSort

    java8 Arrays.sort 与Arrays.parallelSort Sort方法 java8中Arrays.sort()方法有很多重载方式,先来看看对byte类型的排序 static voi ...

  3. 深入学习java源码之 Arrays.sort()与Arrays.parallelPrefix()

    深入学习java源码之 Arrays.sort()与Arrays.parallelPrefix() Comparator接口 能对不同类型的对象进行排序(当然排序依据还是基本类型),也不用自己实现排序 ...

  4. Arrays.sort与Arrays.parallelSort区别

    概述 我们都使用过 Arrays.sort() 对对象或原始数据类型数组(byte,short,int,long,char,float,double和boolean)进行排序.在 JDK 8 中,创造 ...

  5. arrays.sort(._Arrays.sort与Arrays.parallelSort

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

  6. Java的Arrays.sort()良心总结

    C语言的stilib.h头文件中有qsort(),C++的STL库中有sort(),这些封装好的排序函数让我们避免了比赛手写排序,给我们解题带来了的便利.在Java的Arrays类中也封装好了类似的方 ...

  7. Java中的Arrays.sort(int[])

    Arrays.sort(int[]) Arrays.sort(int[])使用的是quicksort+merge sort. 使用quicksort:当数组长度比较小(right-left<28 ...

  8. 更高效地刷OJ——Java中常用的排序方法,Array.sort(),Arrays.parallelSort(), Collections.sort()

    对于几大传统的排序算法我在前面博客中已经介绍过了,如果有想要了解的同学可以去看这篇博客八大排序:冒泡排序,选择排序,插入排序,堆排序,希尔排序,归并排序,计数排序但是我们在刷题过程中如果题目中没有对排 ...

  9. Java数组排序: Array-ArrayList-List-Collections.sort()/List.sort()/Arrays.sort()

    文章目录 ArrayList/List 的排序:Collections.sort()/List.sort() Array 的排序:Arrays.sort() 此文首发于我的Jekyll博客:zhang ...

最新文章

  1. 渗透测试:正义黑客的渗透测试以及该过程和黑客活动的区别
  2. mysql blob 比较_MySQL下,text 、blob的比较
  3. 【NLP】NLP重铸篇之Fasttext
  4. s6-8 TCP 拥塞控制
  5. 优化 .NET Core logging 中的泛型 logger
  6. iOS 两个tableview的 瀑布流
  7. python绘制如下图形、小三角形边长20_python二级操作题与分析(7)
  8. 【AI参赛经验】汉字书法识别入门—by:真的学不会
  9. 同步机构应遵循哪些基本准则
  10. HDU 1002 A+BII大数
  11. (19)一篇掌握MySQL数据库基础下 基本操作(外键约束、建表原则、多表查询、子查询)
  12. ruby-to_ary
  13. git 修改倒数二个 commit
  14. 用javascript编写的小游戏-打砖块
  15. 浅谈运营商线路-----TDM、SDH、MSTP,OTN
  16. 网络原理与交换机路由器应用
  17. C盘空间不足怎么办,如何让C盘获得更多空间
  18. Linux命令 - rmdir命令
  19. 使用unity制作简单的VR时打包APK出现的几个问题
  20. Aleo创始人Howard Wu:我们如何理解Aleo项目

热门文章

  1. 直方图 帕累托图_如何发现现象背后的关键因素?帕累托图,质量管理的利器...
  2. 查看oracle会话和进程_带有Oracle Digital Assistant和Fn Project的会话式UI
  3. junit 验证日志输出_JUnit规则–引发异常时执行附加验证
  4. 光盘 机密_使用保险柜管理机密
  5. 2015年传智播客java_2015年Java 8强势开始
  6. 数据库连接配置tomcat_Tomcat到Wildfly:配置数据库连接
  7. 通过SSL发送的Java邮件
  8. 谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!
  9. IBM将收购Red Hat:面向Java的初衷
  10. Java机器学习,第2部分