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

IT小君   2021-10-25T02:48:23

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

点击广告,支持我们为你提供更好的服务
评论(7)
IT小君

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

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

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

在此处输入图片说明

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

2021-10-25T02:48:23   回复
IT小君

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 公共池用于执行任何并行任务。

数组排序():

这使用合并排序 OR Tim Sort 下面来对内容进行排序。这一切都是按顺序完成的,尽管归并排序使用了分治技术,但都是按顺序完成的。

来源

2021-10-25T02:48:23   回复
IT小君

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

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

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

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

API 使用多个线程。

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

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

2021-10-25T02:48:23   回复
IT小君

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

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

2021-10-25T02:48:24   回复
IT小君

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

2021-10-25T02:48:24   回复
IT小君

从这个链接

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

2021-10-25T02:48:24   回复
IT小君

Array.sort(myArray);

您现在可以使用 –

Arrays.parallelSort(myArray);

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

来源链接

2021-10-25T02:48:24   回复