首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arrays.sort()和Arrays.parallelSort()之间的区别

Arrays.sort()和Arrays.parallelSort()之间的区别
EN

Stack Overflow用户
提问于 2013-06-27 02:46:06
回答 7查看 26.7K关注 0票数 29

正在浏览Java 8的功能,提到了here。我不能理解parallelSort()到底做了什么。有人能解释一下sort()parallelSort()之间的实际区别吗

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-06-27 02:49:34

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

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

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

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

票数 52
EN

Stack Overflow用户

发布于 2013-06-27 02:48:57

Arrays.parallelSort():

该方法使用一个阈值,并且使用Arrays#sort()

对任何小于阈值的数组进行排序(即顺序排序)。并且阈值是考虑机器的并行度、数组的大小来计算的,并且计算如下:

代码语言:javascript
复制
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排序对内容进行排序。这一切都是按顺序完成的,尽管合并排序使用了分而治之的技术,但它都是按顺序完成的。

Source

票数 15
EN

Stack Overflow用户

发布于 2013-06-27 02:57:43

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

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

  • 该应用编程接口使用单线程执行该操作。
  • 该应用编程接口执行该操作所需的时间稍长。

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

API使用多线程。

  • ()相比,
  • 所需的时间更少。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17328077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档