Java 为什么我使用ForkJoin的快速排序如此缓慢?

Java 为什么我使用ForkJoin的快速排序如此缓慢?,java,quicksort,fork-join,Java,Quicksort,Fork Join,我有一个简单的程序使用ForkJoin来加速快速排序,但我发现使用标准分区方法的排序算法比使用我的分区方法的排序算法快得多 如果不使用ForkJoin,则两个分区方法的时间性能几乎相同。但我希望我的分区方法更快 编辑:比较的是使用ForkJoin的标准分区()和使用ForkJoin的mypartition,因此它与线程开销无关 编辑: 使用标准分区方法和3个线程时 sorted: true total time: 3368 sorted: true total time: 1578 sor

我有一个简单的程序使用ForkJoin来加速快速排序,但我发现使用标准分区方法的排序算法比使用我的分区方法的排序算法快得多

如果不使用ForkJoin,则两个分区方法的时间性能几乎相同。但我希望我的分区方法更快


编辑:比较的是使用ForkJoin的标准分区()和使用ForkJoin的mypartition,因此它与线程开销无关


编辑:

使用标准分区方法和3个线程时

sorted: true
total time: 3368
sorted: true
total time: 1578
sorted: true
total time: 3587
sorted: true
total time: 2478
使用我的分区方法和3个线程时

sorted: true
total time: 3368
sorted: true
total time: 1578
sorted: true
total time: 3587
sorted: true
total time: 2478
因此,结果表明,ForkJoin对于标准分区方法很有效,但对于我的分区方法不太有效


package me.shu.lang.java.forkjoin;
导入java.util.array;
导入java.util.Random;
导入java.util.concurrent.ForkJoinPool;
导入java.util.concurrent.RecursiveAction;
公共类FJSort扩展了递归操作{
/**
* 
*/
私有静态最终长serialVersionUID=6386324579247067081L;
最终整数阈值=32;
最终int[]数据;
最终国际劳工组织;
最终国际hi;
公共FJSort(int n)
{
this.data=新整数[n];
这是0.lo=0;
hi=n;
Random rand=新的Random();
对于(int i=0;ii;)
{

if(data[j]很可能是因为使用线程的开销高到足以抵消任何并行化收益。问题是,在使用ForkJoin时,标准分区()比mypartition()快得多。这与使用线程的开销无关。问题1是您使用的是invokeAll(左,右).这应该是left.fork,right.compute.left.join.Invoke在继续之前等待其他计算完成,这是一个显著的减速。看看Java8中的并行排序。join本身工作不太好,所以CountedCompleter是一个更好的选择。@edharned,我不太明白。我不认为这是减速。在ForkJoin中,首先处理子任务,没有线程等待子任务完成,因为线程可以窃取其他线程的任务。您希望窃取将运行任务,但这不是问题所在。当该线程可以自行运行时,您强制一个线程等待两个其他线程完成。无法保证将计算哪个线程在任何给定的时间调用您的工作将任务放入提交队列,而不是工作线程队列。对于Java7,只有一个提交队列,您希望有足够的空闲线程将任务从提交队列中拉出。情况并非总是这样,因为工作线程需要在查看提交队列之前完成请求。