第一届淘宝并发编程比赛-多线程排序性能优化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