29

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

4

7 回答 7

52

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

当集合中有很多元素时,它会更快。并行化的开销(分成块和合并)在较大的集合上变得相当小,但对于较小的集合来说却很大。

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

在此处输入图像描述

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

于 2013-06-26T18:49:34.427 回答
15

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/加入将负责合并排序数组的任务。JDK 8 中的实现使用了这种方法:

  • 将数组分成 4 个部分。

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

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

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

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

数组排序():

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

资源

于 2013-06-26T18:48:57.250 回答
5

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

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

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

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

API 使用多个线程。

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

要获得更多结果,我想我们都必须等待 JAVA 8 !干杯!!

于 2013-06-26T18:57:42.807 回答
3

您可以参考javadoc,其中解释了如果数组足够大,该算法会使用多个线程:

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

于 2013-06-26T18:51:20.770 回答
2

简而言之,parallelSort使用多个线程。如果你真的想知道,这篇文章有更多的细节。

于 2013-06-26T18:49:43.990 回答
2

从这个链接

Java Collections Framework 提供的当前排序实现(Collections.sort 和 Arrays.sort)都在调用线程中按顺序执行排序操作。此增强功能将提供与 Arrays 类当前提供的相同的排序操作集,但具有利用 Fork/Join 框架的并行实现。这些新的 API 对于调用线程仍然是同步的,因为在并行排序完成之前它不会继续通过排序操作。

于 2013-06-26T18:50:48.557 回答
1

Array.sort(myArray);

您现在可以使用 -</p>

Arrays.parallelSort(myArray);

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

链接

于 2014-06-02T05:53:51.333 回答