arrays.sort(.

我们都使用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 / Join任务将负责合并已排序的数组。 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针对不同大小的双精度值数组所花费的时间如下所示:

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

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

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

arrays.sort(.

arrays.sort(._Arrays.sort与Arrays.parallelSort相关推荐

  1. arrays.sort(._Arrays.hashCode(Object [])与Objects.hash(Object…)

    arrays.sort(. 从JDK 1.5开始 , Arrays类提供了名为" hashCode "的重载static方法. 大多数重载方法都接受特定原始类型的数组,但是Arra ...

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

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

  3. java arrays方法_Java工具类Arrays中不得不知的常用方法

    原标题:Java工具类Arrays中不得不知的常用方法 Arrays 数组操作集数组转List ---asList 这个被"普遍"称为数组转List的方法,可能是Arrays内大家 ...

  4. count sort, radix sort, bucket sort

    count sort, radix sort, bucket sort 标签(空格分隔): algorithms 基于比较的排序算法,都逃不过O(nlogn)O(nlogn)O(nlogn)的宿命1. ...

  5. ORA-12805: parallel query server died unexpectedly ORA-04030 (sort subheap,sort key) 原因排查与解决方法

    ORA-12805: parallel query server died unexpectedly ORA-04030 (sort subheap,sort key) 原因排查与解决方法 参考文章: ...

  6. Sort sort =new Sort(Sort.Direction.ASC,“id“)

    错误代码: Sort sort =new Sort(Sort.Direction.ASC,"id") 原因分析: 新的版本中不能使用 new 来创建了 解决方案: Sort sor ...

  7. sort sort -r sort -n sort -nr的区别

    sort    sort -r将数字当做字符进行排序 sort -n  sort -nr 按照整个数字来排序 举例说明: linux系统中新建一个num.txt,neir内容如下 使用sort排序 使 ...

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

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

  9. java arrays.sort原理_Arrays.sort()原理

    java中Arrays.sort使用了两种排序方法,快速排序和优化的归并排序. 快速排序主要是对哪些基本类型数据(int,short,long等)排序, 而合并排序用于对对象类型进行排序.使用不同类型 ...

最新文章

  1. chart.Correlation绘制相关性热图
  2. Vue报错:Error while running task D:\vue\forum:build with message‘spawn vue-cli-service ENOENT‘
  3. Vue中用TypeScript改写JavaScript及装饰器使用
  4. 续: [转]Oracle 表空间与数据文件
  5. 架构之各种参数对应表
  6. 【笔记】iOS开发基础笔记二
  7. python只读模式可以打印嘛_只读python属性?无法打印对象
  8. [转]SQL中的case when then else end用法
  9. CentOS 下无线网卡的安装和使用
  10. 017—mysql问答
  11. Confluence 6 Oracle 创建数据库用户
  12. 速领,阿里巴巴Java开发手册终极版
  13. 数据结构与算法-第三章 链表
  14. ffmpeg 命令转为 avi,mp4,h264, yuv
  15. 百度AI开放平台- API实战调用
  16. linux qemu的使用教程,详解QEMU网络配置的方法
  17. 联想用u盘重装系统步骤_联想电脑怎样用U盘重装系统?
  18. gan处理自己的数据集_使用StyleGAN训练自己的数据集.md
  19. 如何修复Windows 10中最烦人的东西
  20. H5 - 实现半颗星评分功能

热门文章

  1. Linux运维常用检查网络工具
  2. 汇编语言(十五)之找出两个数组中的相同元素
  3. Spring Boot 面试题
  4. 优秀 Java 程序员写代码的风格
  5. 内存不足The following exception is caused by a lack of memory or swap, or not having swap
  6. linux服务器部署laravel出现putenv() has been disabled for security reasons
  7. 若依前后端部署之后验证码不显示
  8. layui结合springboot上传图片
  9. 新的学期、新的开始、新的付出、新的收获!
  10. ssm使用全注解实现增删改查案例——applicationContext.xml