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