【发布时间】:2011-10-25 17:49:10
【问题描述】:
我正在尝试使用 Java 中的并行化算法。我从合并排序开始,并在question 中发布了我的尝试。我修改后的尝试在下面的代码中,我现在尝试并行化快速排序。
在我的多线程实现或解决此问题的方法中是否存在任何新手错误?如果不是,我不应该期望双核上的顺序算法和并行算法之间的速度增加超过 32%(参见底部的时序)吗?
这里是多线程算法:
public class ThreadedQuick extends Thread
{
final int MAX_THREADS = Runtime.getRuntime().availableProcessors();
CountDownLatch doneSignal;
static int num_threads = 1;
int[] my_array;
int start, end;
public ThreadedQuick(CountDownLatch doneSignal, int[] array, int start, int end) {
this.my_array = array;
this.start = start;
this.end = end;
this.doneSignal = doneSignal;
}
public static void reset() {
num_threads = 1;
}
public void run() {
quicksort(my_array, start, end);
doneSignal.countDown();
num_threads--;
}
public void quicksort(int[] array, int start, int end) {
int len = end-start+1;
if (len <= 1)
return;
int pivot_index = medianOfThree(array, start, end);
int pivotValue = array[pivot_index];
swap(array, pivot_index, end);
int storeIndex = start;
for (int i = start; i < end; i++) {
if (array[i] <= pivotValue) {
swap(array, i, storeIndex);
storeIndex++;
}
}
swap(array, storeIndex, end);
if (num_threads < MAX_THREADS) {
num_threads++;
CountDownLatch completionSignal = new CountDownLatch(1);
new ThreadedQuick(completionSignal, array, start, storeIndex - 1).start();
quicksort(array, storeIndex + 1, end);
try {
completionSignal.await(1000, TimeUnit.SECONDS);
} catch(Exception ex) {
ex.printStackTrace();
}
} else {
quicksort(array, start, storeIndex - 1);
quicksort(array, storeIndex + 1, end);
}
}
}
我是这样开始的:
ThreadedQuick.reset();
CountDownLatch completionSignal = new CountDownLatch(1);
new ThreadedQuick(completionSignal, array, 0, array.length-1).start();
try {
completionSignal.await(1000, TimeUnit.SECONDS);
} catch(Exception ex){
ex.printStackTrace();
}
我针对 Arrays.sort 和类似的顺序快速排序算法对此进行了测试。以下是英特尔双核戴尔笔记本电脑上的计时结果,以秒为单位:
元素:500,000, 顺序:0.068592, 螺纹:0.046871, Arrays.sort: 0.079677
元素:1,000,000, 顺序:0.14416, 螺纹:0.095492, Arrays.sort: 0.167155
元素:2,000,000, 顺序:0.301666, 螺纹:0.205719, Arrays.sort: 0.350982
元素:4,000,000, 顺序:0.623291, 螺纹:0.424119, Arrays.sort: 0.712698
元素:8,000,000, 顺序:1.279374, 螺纹:0.859363, Arrays.sort: 1.487671
以上每个数字是 100 次测试的平均时间,剔除 3 个最低和 3 个最高的情况。我使用 Random.nextInt(Integer.MAX_VALUE) 为每个测试生成一个数组,每 10 次测试使用相同的种子初始化一次。每个测试都包括使用 System.nanoTime 对给定算法进行计时。我平均后四舍五入到小数点后六位。显然,我确实检查了每种排序是否有效。
如您所见,在每组测试中,顺序用例和线程用例之间的速度提高了大约 32%。正如我上面所问的,我不应该期待更多吗?
【问题讨论】:
-
您说的是哪种语言?你想知道如何在 Java 或 C# 中排序
-
所以问题是如何在 Java 中实现这种语法并优化线程与 CPU 的工作。
-
我认为如果您在帖子底部总结您的问题会有所帮助。由于它是写的,它有点难以阅读。伙计们,如果可以的话,请放轻松并进行编辑,此用户正在尝试改进并获得他需要的答案。
-
@Ronald Wildenberg 谢谢,这很有帮助。
-
好的。你可以关闭..如果我在 cmets 中问,有人可以回答我吗?
标签: java multithreading parallel-processing quicksort