arrays.sort(._Arrays.sort与Arrays.parallelSort
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针对不同大小的双精度值数组所花费的时间如下所示:
列表也有类似的实现,并且列表上的许多操作具有并行的等效项。
翻译自: https://www.javacodegeeks.com/2013/04/arrays-sort-versus-arrays-parallelsort.html
arrays.sort(.
arrays.sort(._Arrays.sort与Arrays.parallelSort相关推荐
- arrays.sort(._Arrays.hashCode(Object [])与Objects.hash(Object…)
arrays.sort(. 从JDK 1.5开始 , Arrays类提供了名为" hashCode "的重载static方法. 大多数重载方法都接受特定原始类型的数组,但是Arra ...
- Java数组排序: Array-ArrayList-List-Collections.sort()/List.sort()/Arrays.sort()
文章目录 ArrayList/List 的排序:Collections.sort()/List.sort() Array 的排序:Arrays.sort() 此文首发于我的Jekyll博客:zhang ...
- java arrays方法_Java工具类Arrays中不得不知的常用方法
原标题:Java工具类Arrays中不得不知的常用方法 Arrays 数组操作集数组转List ---asList 这个被"普遍"称为数组转List的方法,可能是Arrays内大家 ...
- count sort, radix sort, bucket sort
count sort, radix sort, bucket sort 标签(空格分隔): algorithms 基于比较的排序算法,都逃不过O(nlogn)O(nlogn)O(nlogn)的宿命1. ...
- 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) 原因排查与解决方法 参考文章: ...
- Sort sort =new Sort(Sort.Direction.ASC,“id“)
错误代码: Sort sort =new Sort(Sort.Direction.ASC,"id") 原因分析: 新的版本中不能使用 new 来创建了 解决方案: Sort sor ...
- sort sort -r sort -n sort -nr的区别
sort sort -r将数字当做字符进行排序 sort -n sort -nr 按照整个数字来排序 举例说明: linux系统中新建一个num.txt,neir内容如下 使用sort排序 使 ...
- bucket sort sample sort 并行_Java 中 Arrays.sort 和 Arrays.parallelSort 哪个更快?
1. 概述 我们都使用过 Arrays.sort() 对对象或原始数据类型数组(byte,short,int,long,char,float,double和boolean)进行排序.在 JDK 8 中 ...
- java arrays.sort原理_Arrays.sort()原理
java中Arrays.sort使用了两种排序方法,快速排序和优化的归并排序. 快速排序主要是对哪些基本类型数据(int,short,long等)排序, 而合并排序用于对对象类型进行排序.使用不同类型 ...
最新文章
- chart.Correlation绘制相关性热图
- Vue报错:Error while running task D:\vue\forum:build with message‘spawn vue-cli-service ENOENT‘
- Vue中用TypeScript改写JavaScript及装饰器使用
- 续: [转]Oracle 表空间与数据文件
- 架构之各种参数对应表
- 【笔记】iOS开发基础笔记二
- python只读模式可以打印嘛_只读python属性?无法打印对象
- [转]SQL中的case when then else end用法
- CentOS 下无线网卡的安装和使用
- 017—mysql问答
- Confluence 6 Oracle 创建数据库用户
- 速领,阿里巴巴Java开发手册终极版
- 数据结构与算法-第三章 链表
- ffmpeg 命令转为 avi,mp4,h264, yuv
- 百度AI开放平台- API实战调用
- linux qemu的使用教程,详解QEMU网络配置的方法
- 联想用u盘重装系统步骤_联想电脑怎样用U盘重装系统?
- gan处理自己的数据集_使用StyleGAN训练自己的数据集.md
- 如何修复Windows 10中最烦人的东西
- H5 - 实现半颗星评分功能
热门文章
- Linux运维常用检查网络工具
- 汇编语言(十五)之找出两个数组中的相同元素
- Spring Boot 面试题
- 优秀 Java 程序员写代码的风格
- 内存不足The following exception is caused by a lack of memory or swap, or not having swap
- linux服务器部署laravel出现putenv() has been disabled for security reasons
- 若依前后端部署之后验证码不显示
- layui结合springboot上传图片
- 新的学期、新的开始、新的付出、新的收获!
- ssm使用全注解实现增删改查案例——applicationContext.xml