Java 多线程快速排序比普通快速排序耗时更长
我已经使用多线程实现了快速排序,它正确地排序整数数组,但是执行速度比普通的快速排序要长。 例如,对10000个整数进行排序 多线程:6856毫秒 正常:1毫秒 我不知道我的代码出了什么问题Java 多线程快速排序比普通快速排序耗时更长,java,multithreading,quicksort,Java,Multithreading,Quicksort,我已经使用多线程实现了快速排序,它正确地排序整数数组,但是执行速度比普通的快速排序要长。 例如,对10000个整数进行排序 多线程:6856毫秒 正常:1毫秒 我不知道我的代码出了什么问题 public void run() { quickSort1(this.Array,this.low,this.high); } int partition(int[]A,int l,int r) { int v = A[r]; int i = l; int j = r;
public void run()
{
quickSort1(this.Array,this.low,this.high);
}
int partition(int[]A,int l,int r)
{
int v = A[r];
int i = l;
int j = r;
while(i<j)
{
while(A[i]<v)
{
i++;
}
while((i<j)&&(A[j]>=v))
{
j--;
}
if(i<j)
{
int C = A[i];
A[i] = A[j];
A[j] = C;
}
else
{
int D = A[i];
A[i] = A[r];
A[r] = D;
}
}
return i;
}
void quickSort1(int[] A,int l,int r)
{
int i;
if(r>l)
{
i = partition(A,l,r);
quickSort sort1 = new quickSort(A,l,i-1);
Thread t1 = new Thread(sort1);
quickSort sort2 = new quickSort(A,i+1,r);
Thread t2 = new Thread(sort2);
t1.start();
t2.start();
try
{
t1.join();
t2.join();
}catch(Exception e){}
}
}
void normal_quickSort(int[] A,int l,int r)
{
int i;
if(r>l)
{
i = partition(A,l,r);
normal_quickSort(A,l,i-1);
normal_quickSort(A,i+1,r);
}
}
public void run()
{
quickSort1(this.Array,this.low,this.high);
}
int分区(int[]A,int-l,int-r)
{
int v=A[r];
int i=l;
int j=r;
而(i2个问题
(1) 您创建的线程太多。创建线程的成本很高。对于绑定计算的任务,如果您创建的线程总数大于平台中的CPU数量,则可能是错误的
诀窍是将线程汇集在一起(例如,创建一个java.util.concurrent.ThreadPoolExecutor
,并为其指定要执行的任务)
(2) 您正在将工作分解为太小的任务。同步线程和在线程之间传递数据的成本也很高。虽然没有创建和销毁线程那么高,但您要执行的次数仍然有限制
您的算法可能会将工作分配到以下位置:为线程提供一个包含一个元素的列表,并要求线程对其进行“排序”。这对于多线程来说是一个小得可笑的任务
要实现快速排序,您必须不断地将数组拆分为越来越小的块,但您不必将每个块分配给不同的线程,而且在它们足够小之后,您不应该这样做。我不知道小到什么程度才足够小(100?1000?10000?),但您可以很容易地进行实验来找出答案。两个问题
(1) 您创建的线程太多。创建线程的成本很高。对于绑定计算的任务,如果您创建的线程总数大于平台中的CPU数量,则可能是错误的
诀窍是将线程汇集在一起(例如,创建一个java.util.concurrent.ThreadPoolExecutor
,并为其指定要执行的任务)
(2) 您正在将工作分解为太小的任务。同步线程和在线程之间传递数据的成本也很高。虽然没有创建和销毁线程那么高,但您要执行的次数仍然有限制
您的算法可能会将工作分配到以下位置:为线程提供一个包含一个元素的列表,并要求线程对其进行“排序”。这对于多线程来说是一个小得可笑的任务
要实现快速排序,您必须不断地将数组拆分为越来越小的块,但您不必将每个块分配给不同的线程,而且在它们变得足够小之后,您不应该这样做。我不知道多小才算足够小(100?1000?10000?),但您可以很容易地进行实验来发现。我要说的是,创建线程所需的开销大于在单个线程中进行计算所需的开销。只有一个问题:您有多少线程?@BitExodus从外观上看,是数组元素数减1的两倍。@BitExodus每次对数组I进行分区时nto two我有两个线程来处理子数组。@BitExodus这是因为我没有线程创建的开销;)我要说的是,创建线程所需的开销大于在单个线程中进行计算所需的开销。只有一个问题:您有多少个线程?@BitExodus从外观上看,是数组元素数减去1的两倍。@BitExodus每次将数组分成两部分时,我有两个线程来处理子arrays@BitExodus这是因为我没有线程创建的开销;)谢谢你的详细回答。我会尝试实现它。谢谢你的详细回答。我会尝试实现它。