正在经历这里Java 8
提到的功能。无法理解到底是做什么的。有人可以解释和之间的实际区别是什么吗?parallelSort()
sort()
parallelSort()
7 回答
并行排序使用线程- 每个线程获取列表的一个块,并且所有块都并行排序。然后将这些排序的块合并到一个结果中。
当集合中有很多元素时,它会更快。并行化的开销(分成块和合并)在较大的集合上变得相当小,但对于较小的集合来说却很大。
看看这张表(当然,结果取决于 CPU、内核数、后台进程等):
取自此链接:http ://www.javacodegeeks.com/2013/04/arrays-sort-versus-arrays-parallelsort.html
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 对内容进行排序。这一切都是按顺序完成的,即使归并排序使用分而治之的技术,它也是按顺序完成的。
两种算法之间的主要区别如下:
1. Arrays.sort():是顺序排序。
- API 使用单线程进行操作。
- API 需要更长的时间来执行操作。
2. Arrays.ParallelSort():是一种并行排序。
API 使用多个线程。
- 与 Sort() 相比,API 花费的时间更少。
要获得更多结果,我想我们都必须等待 JAVA 8 !干杯!!
您可以参考javadoc,其中解释了如果数组足够大,该算法会使用多个线程:
排序算法是一种并行排序合并,它将数组分解为子数组,这些子数组本身已排序然后合并。当子数组长度达到最小粒度时,使用适当的
Arrays.sort
方法对子数组进行排序。[...]公共ForkJoin
池用于执行任何并行任务。
简而言之,parallelSort
使用多个线程。如果你真的想知道,这篇文章有更多的细节。
从这个链接
Java Collections Framework 提供的当前排序实现(Collections.sort 和 Arrays.sort)都在调用线程中按顺序执行排序操作。此增强功能将提供与 Arrays 类当前提供的相同的排序操作集,但具有利用 Fork/Join 框架的并行实现。这些新的 API 对于调用线程仍然是同步的,因为在并行排序完成之前它不会继续通过排序操作。
Array.sort(myArray);
您现在可以使用 -</p>
Arrays.parallelSort(myArray);
这将自动将目标集合分成几个部分,这些部分将在多个核心上独立排序,然后再组合在一起。这里唯一需要注意的是,当在高度多线程的环境中调用时,例如繁忙的 Web 容器,由于增加 CPU 上下文切换的成本,这种方法的好处将开始减少(超过 90%)。
源链接