【发布时间】:2011-05-07 22:49:44
【问题描述】:
我刚刚实现了合并排序的线程版本。 ThreadedMerge.java:http://pastebin.com/5ZEvU6BV
由于合并排序是一种分而治之的算法,我为数组的每一半创建一个线程。但是 Java-VM 中可用线程的数量是有限的,所以我在创建线程之前检查一下:
if(num <= nrOfProcessors){
num += 2;
//create more threads
}else{
//continue without threading
}
但是,线程排序大约需要 ~ 6000 ms,而非线程版本只需 ~ 2500 ms 就快得多。
非线程:http://pastebin.com/7FdhZ4Fw
为什么线程版本较慢,我该如何解决这个问题?
更新:我现在使用atomic integer 进行线程计数,并为Runtime.getRuntime().availableProcessors() 声明了一个静态字段。现在排序大约需要~ 1400 ms。
但是,在 mergeSort 方法中只创建一个线程并让当前线程完成其余的工作并没有显着的性能提升。 为什么?
除了当我在一个线程上调用 join 之后减少使用的线程数
num.set(num.intValue() - 1);
排序大约需要~ 200 ms 更长的时间。这里是我算法的更新http://pastebin.com/NTZq5zQp为什么这行代码会更糟?
【问题讨论】:
-
我不知道你的数据,但对于小型数组,创建线程的开销很容易超过并行收益。另外,你知道线程是否真的在不同的处理器中?
标签: java multithreading