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

时间:2013-06-26 18:46:06

标签: java arrays sorting java-8

正在审核Java 8功能,提及here。无法理解parallelSort()究竟做了什么。有人可以解释sort()parallelSort()之间的实际差异吗?

7 个答案:

答案 0 :(得分:44)

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

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

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

enter image description here

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

答案 1 :(得分: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;
}
  

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

     
      
  • 将数组分为4个部分。

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

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

  •   

您还可以阅读Javadoc

中的实施细节
  

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

的Array.sort():

  

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

Source

答案 2 :(得分:4)

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

<强> 1。 Arrays.sort():是一个顺序排序。

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

<强> 2。 Arrays.ParallelSort():是一个并行排序。

API使用多个线程。

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

为了获得更多结果,我们都必须等待JAVA 8我猜!欢呼!!

答案 3 :(得分:3)

你可以参考the javadoc,它解释了如果数组足够大,算法会使用多个线程:

  

排序算法是一种并行排序合并,它将数组分解为自身排序然后合并的子数组。当子阵列长度达到最小粒度时,使用适当的Arrays.sort方法对子阵列进行排序。 [...] ForkJoin公共池用于执行任何并行任务。

答案 4 :(得分:2)

简而言之,parallelSort使用多个线程。如果你真的想知道,这个article会有更详细的信息。

答案 5 :(得分:2)

从此link

  

Java Collections提供的当前排序实现   Framework(Collections.sort和Arrays.sort)都执行排序   在调用线程中顺序操作。这个增强会   提供目前提供的同一组排序操作   数组类,但使用了并行实现   Fork / Join框架。这些新的API仍然是同步的   到调用线程,因为它不会继续进行排序   操作直到并行排序完成。

答案 6 :(得分:1)

Array.sort(myArray);

您现在可以使用 -

Arrays.parallelSort(myArray);

这会自动将目标集合分成几个部分,这些部分将在多个核心中独立排序,然后重新组合在一起。这里唯一需要注意的是,当在高度多线程环境中调用时,例如繁忙的Web容器,由于增加了CPU上下文切换的成本,这种方法的好处将开始减少(超过90%)。

来源 - link