Arrays.sort() 和 Arrays.parallelSort() 之间的区别

2022-09-01 12:31:16

正在经历这里提到的功能。无法理解到底是什么。有人可以解释一下 和 之间的实际区别是什么吗?Java 8parallelSort()sort()parallelSort()


答案 1

并行排序使用线程 - 每个线程获取列表的一个块,并且所有块都并行排序。然后,这些排序的块将合并到结果中。

当集合中有很多元素时,它的速度会更快。并行化(拆分为块和合并)的开销在较大的集合上变得可以容忍地小,但对于较小的集合,它很大。

看看这个表(当然,结果取决于CPU,内核数量,后台进程等):

enter image description here

摘自此链接:http://www.javacodegeeks.com/2013/04/arrays-sort-versus-arrays-parallelsort.html


答案 2

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 部分。

  • 对前两个部分进行排序,然后合并它们。

  • 对接下来的两个部分进行排序,然后合并它们。并且上述步骤与每个部分一起递归重复,直到要排序的部分的大小不小于上面计算的阈值。

您还可以阅读 Javadoc 中的实现详细信息

排序算法是一种并行排序合并,它将数组分解为子数组,这些子数组本身进行排序然后合并。当子数组长度达到最小粒度时,将使用相应的 Arrays.sort 方法对子数组进行排序。如果指定数组的长度小于最小粒度,则使用相应的 Arrays.sort 方法对其进行排序。该算法需要的工作空间不大于原始数组的指定范围的大小。ForkJoin 公共池用于执行任何并行任务。

Array.sort():

这将使用合并排序或下面的 Tim 排序对内容进行排序。这一切都是按顺序完成的,即使合并排序使用分而治之技术,这一切都是按顺序完成的。