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

Gok*_* KP 23 java arrays sorting java-8

正在浏览这里Java 8提到的功能.无法理解究竟是什么.有人可以解释一下和之间的实际区别是什么?parallelSort()sort()parallelSort()

dar*_*jan 48

并行排序使用线程(每个线程获取列表的一部分并对其进行并行排序.稍后这些排序的块将合并到一个结果中).

当集合中有很多元素时,它会更快.并行化的开销在较大的阵列上变得相当小,但对于较小的阵列而言则很大.

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

在此输入图像描述

取自以下链接:http://www.javacodegeeks.com/2013/04/arrays-sort-versus-arrays-parallelsort.html

  • 在该测试中,时间测量绝对不正确.另请注意,如果输入数组小于4096,则parallelSort只需调用顺序排序算法.你真的相信额外的长度检查需要3毫秒的602元素吗? (5认同)

NIN*_*OOP 14

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;
}
Run Code Online (Sandbox Code Playgroud)

一旦决定是并行还是串行对数组进行排序,现在决定如何将数组分成多个部分然后将每个部分分配给一个Fork/Join任务,它将负责对它进行排序然后另一个Fork /加入任务,负责合并排序的数组.JDK 8中的实现使用了这种方法:

  • 将阵列分为4个部分.

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

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

您还可以阅读Javadoc中的实现细节

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

中的Array.sort():

这使用合并排序或下面的Tim Sort来对内容进行排序.这是按顺序完成的,即使合并排序使用分而治之的技术,它们都按顺序完成.

资源


PVR*_*PVR 5

两种算法的主要区别如下:

1. Arrays.sort():是顺序排序。

  • API 使用单线程进行操作。
  • API 执行操作需要更长的时间。

2. Arrays.ParallelSort():是一种并行排序。

API 使用多个线程。

  • 与 Sort() 相比,API 花费的时间更少。

对于更多的结果,我们都必须等待 JAVA 8 我猜!干杯!!