第一届淘宝并发编程比赛-多线程排序性能优化
去年一粟在淘宝内部组织了第一届淘宝并发编程比赛。
具体比赛问题请移步这里:https://github.com/Skinney/WordSorter 查看。
里面已经有可运行的代码,在一粟的机器上(RMBP 2012: 2.7 GHz Intel Core i7)运行速度如下:
[code]
16:07:49 hugo-rmbp ~/Projects/hugozhu/WordSorter/Go $ go run main.go 128 sowpods.txt out.txt
WordSort finished in <strong>335 ms</strong>
16:07:19 hugo-rmbp ~/Projects/hugozhu/WordSorter/Java $ java Sort 128 sowpods.txt out.txt
Loading contents of sowpods.txt… 170ms
Sorting… 222ms
Writing results to out.txt… 135ms
Using 128 threads, 267751 words was sorted in <strong>528</strong> milliseconds.
[/code]
Java落后很多, 但看实现I/O部分耗费了一半多的时间,我们可以来优化一下Java实现:提高一下I/O性能,或者试一下Fork/Join框架,请大家都试试,把优化结果贴上来比较。
代码可以上传到github或google code,taocode等地方,然后贴一个链接上来,实现不限语言。
感兴趣的朋友可以一起做一下,过段时间本网站会分享本届比赛前2名淘宝同学的代码,以及第一名的优化分享。
原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 第一届淘宝并发编程比赛-多线程排序性能优化
没必要线程数都一样吧
我测出来2个差距不大么,都是800ms左右,机器:i7 640m 2.8g
把线程加到512的时候差距明显了,线程数少的时候还是java跑的快
我来支持一下,写了个C版本的
说明在:http://www.cnblogs.com/jiayy/p/3419884.html
代码在:https://github.com/jiayeah/WordSorter.git
性能,
Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
8个线程排序部分
读取文件 20.000000 ms
排序 55.000000 ms
写回文件 48.000000 ms
不会吧,我的测试出来load:600ms+,output:222ms,sort:恐怖80000ms+
优化了下load,换用readline和读取第一行后new words数组,然后循环读入,减少到120ms左右
可以把代码链接贴出来
原程序把线程开到250+的时候,load+sort+out=900ms+ 和单线程边度变add 到一个treeset的方式差不多!如果把load的优化下,估计能到700-800ms左右
请教一下博主:
Sort.java中的interleaveThreads方法中的语句
Interleaver merge = new Interleaver(buffer.getWords(), wordHandlers.poll().getWords());
//这里poll第二个处理handler有无可能因为一些特别情况,其可能还未能处理完成排序,导致错误
我的错,jion保证了
支持,用fork-join实现了下,速度比这个好点
https://github.com/chenzehe/wordsorter-java
那个sowpods.txt能不能给我传一下?我的邮箱是490377610@qq.com,谢谢
https://github.com/Skinney/WordSorter的源码里有。
下不下来
这个多线程的排序跟单线程的快速排序相比,要慢很多的
Loading contents of sowpods.txt… 172ms
Sorting… 7238ms
Writing results to sort.txt… 126ms
Using 8 threads, 267751 words was sorted in 7536 milliseconds.
读取用时:45ms
单线程排序用时:173ms
写入用时:119ms
机器指数:Intel(R)Core(TM)i5-3570 CPU @ 3.40GHz 3.40GHz
题目在那里。。我去网站上找了。找到题目是什么。。
其实花的时间主要在io上,因为数据量比较小,可以直接在内存里面排序,排序耗时是很短的。我看了下样例代码,天哪,你开那么多线程去排序有必要吗?真的有必要吗??多线程很多时候是用来平衡io和cpu的,当数据读进内存之后用太多的线程比单线程还要慢吧?!我试了一下,样例java代码用800+ms,而用单线程只用500+ms。。。
这个数据量有点小吧,我直接用jdk自带的 Collections.sort(list)方法性能都很好,多线程没有显出优势
Collections.sort的结果
load time:122ms
sort time:262ms
write time:129ms
源程序结果
Loading contents of conf/sowpods.txt… 230ms
Sorting… 265ms
Writing results to conf/new_sowpods.txt… 132ms
Using 500 threads, 267751 words was sorted in 627 milliseconds.
开那么多的线程,去搞这么点数据的排序,是不是有点浪费?不过算法还是很好的