我已经实现了合并排序的线程版本。 ThreadedMerge.java:http://pastebin.com/5ZEvU6BV为什么我的线程排序算法比非线程版本慢?
因为合并排序是一个分而治之的算法,所以我为每个数组的一半创建一个线程。但在Java虚拟机可用的编缉线程的数量是有限的,所以我检查创建线程之前:
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
。
但是创造归并方法只有一个线程,并让当前线程完成剩下的没有sigificant的性能提升。 为什么?
而且当后我请一个线程,该减量后使用的线程数联同
num.set(num.intValue() - 1);
排序约需~ 200 ms
更长的时间。这里是我的算法的更新http://pastebin.com/NTZq5zQp为什么这行代码使它更糟?
我不知道你的数据,但创建线程的为小型阵列的开销会很容易超过平行收益。另外,你知道这些线程是否真的在不同的处理器中? – entonio 2011-05-07 23:03:24