第一屆淘寶並發編程比賽-多線程排序性能優化http://ifeve.com/tao-code-match-1/
在這里看到一道題目,從一個文件里讀取字符串,排序,然后寫入另一個文件。
用C實現了一下,邏輯比較簡單:
1 將文件讀取進來放到一個結構數組里
2 根據線程數目N切割這個數組為N個子數組(如果無法整切,多出來的部分由主線程負責排序),每個線程使用qsort算法排序子數組
3 主線程等待所有子線程排好序,然后歸並子線程的結果
4 將結果寫入文件
在我的機器上,Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz,用4個線程,結果如下:
read fp : ./sowpods.txt
num of words : 267751
READ: usetime = 20.000000 ms
SORT: usetime = 29.000000 ms
MEGRE: usetime = 31.000000 ms ——> 29+31 = 60ms 排序用了60ms
write fp : ./results.txt
num of words : 267751
WRITE: usetime = 48.000000 ms
8個線程,排序部分用時 SORT: usetime = 18.000000 ms
MEGRE: usetime = 36.000000 ms 18+36=54ms
16個線程,SORT: usetime = 15.000000 ms
MEGRE: usetime = 45.000000 ms ——> 15+45=60 ms 線程數到達一定數目,性能就上不去了,估計是因為線程增多之后,內核線程固定開銷部分的增加跟由於數據量減少得到的性能提升抵消了
目前存在一個問題:歸並部分目前是單線程的,這個操作時間比較長
代碼可以參考:git clone https://github.com/jiayeah/WordSorter.git