正在审核Java 8
功能,提及here。无法理解parallelSort()
究竟做了什么。有人可以解释sort()
和parallelSort()
之间的实际差异吗?
答案 0 :(得分:44)
并行排序使用 线程 (每个线程获取列表的一部分并对其进行并行排序。稍后这些已排序的块将合并到一个结果中)。
当集合中有很多元素时,它会更快。并行化的开销在较大的阵列上变得相当小,但对于较小的阵列而言则很大。
看看这个表(当然,结果取决于CPU,核心数,后台进程等):
取自此链接: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来对内容进行排序。这是按顺序完成的,即使合并排序使用分而治之的技术,它们都按顺序完成。
答案 2 :(得分:4)
两种算法的主要区别如下:
<强> 1。 Arrays.sort():是一个顺序排序。
<强> 2。 Arrays.ParallelSort():是一个并行排序。
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