我已經實現了合併排序的線程版本。 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