dar*_*jan 48
并行排序使用线程(每个线程获取列表的一部分并对其进行并行排序.稍后这些排序的块将合并到一个结果中).
当集合中有很多元素时,它会更快.并行化的开销在较大的阵列上变得相当小,但对于较小的阵列而言则很大.
看一下这个表(当然,结果取决于CPU,内核数量,后台进程等):
取自以下链接:http://www.javacodegeeks.com/2013/04/arrays-sort-versus-arrays-parallelsort.html
NIN*_*OOP 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;
}
Run Code Online (Sandbox Code Playgroud)
一旦决定是并行还是串行对数组进行排序,现在决定如何将数组分成多个部分然后将每个部分分配给一个Fork/Join任务,它将负责对它进行排序然后另一个Fork /加入任务,负责合并排序的数组.JDK 8中的实现使用了这种方法:
将阵列分为4个部分.
对前两个部分进行排序,然后合并它们.
对下两个部分进行排序,然后合并它们.并且对每个部分递归地重复上述步骤,直到要排序的部分的大小不小于上面计算的阈值.
您还可以阅读Javadoc中的实现细节
排序算法是并行排序合并,它将数组分解为自身排序然后合并的子数组.当子阵列长度达到最小粒度时,使用适当的Arrays.sort方法对子阵列进行排序.如果指定数组的长度小于最小粒度,则使用适当的Arrays.sort方法对其进行排序.该算法要求工作空间不大于原始数组的指定范围的大小.ForkJoin公共池用于执行任何并行任务.
中的Array.sort():
这使用合并排序或下面的Tim Sort来对内容进行排序.这是按顺序完成的,即使合并排序使用分而治之的技术,它们都按顺序完成.
两种算法的主要区别如下:
1. Arrays.sort():是顺序排序。
2. Arrays.ParallelSort():是一种并行排序。
API 使用多个线程。
对于更多的结果,我们都必须等待 JAVA 8 我猜!干杯!!
归档时间: |
|
查看次数: |
23628 次 |
最近记录: |