第一届淘宝并发编程比赛-多线程排序性能优化

去年一粟在淘宝内部组织了第一届淘宝并发编程比赛。

具体比赛问题请移步这里: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本文链接地址: 第一届淘宝并发编程比赛-多线程排序性能优化

  • Trackback 关闭
  • 评论 (20)
    • teasp
    • 2013/11/07 3:19下午

    没必要线程数都一样吧

    • ghost
    • 2013/11/08 10:29上午

    我测出来2个差距不大么,都是800ms左右,机器:i7 640m 2.8g

    • ghost
    • 2013/11/08 10:33上午

    把线程加到512的时候差距明显了,线程数少的时候还是java跑的快

  1. 我来支持一下,写了个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

    • 宅男小何
    • 2013/11/25 3:56下午

    不会吧,我的测试出来load:600ms+,output:222ms,sort:恐怖80000ms+

    • 宅男小何
    • 2013/11/25 4:34下午

    优化了下load,换用readline和读取第一行后new words数组,然后循环读入,减少到120ms左右

    • 宅男小何
    • 2013/11/25 5:05下午

    原程序把线程开到250+的时候,load+sort+out=900ms+ 和单线程边度变add 到一个treeset的方式差不多!如果把load的优化下,估计能到700-800ms左右

    • alley-
    • 2013/12/03 2:08下午

    请教一下博主:
    Sort.java中的interleaveThreads方法中的语句
    Interleaver merge = new Interleaver(buffer.getWords(), wordHandlers.poll().getWords());
    //这里poll第二个处理handler有无可能因为一些特别情况,其可能还未能处理完成排序,导致错误

      • alley-
      • 2013/12/03 3:04下午

      我的错,jion保证了

    • chenzehe
    • 2013/12/04 10:53上午

    支持,用fork-join实现了下,速度比这个好点
    https://github.com/chenzehe/wordsorter-java

  2. 那个sowpods.txt能不能给我传一下?我的邮箱是490377610@qq.com,谢谢

    • wgf
    • 2014/01/06 5:50下午

    这个多线程的排序跟单线程的快速排序相比,要慢很多的
    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

    • wgf
    • 2014/01/06 5:51下午

    机器指数:Intel(R)Core(TM)i5-3570 CPU @ 3.40GHz 3.40GHz

    • 老胡
    • 2014/01/09 9:19上午

    题目在那里。。我去网站上找了。找到题目是什么。。

    • dengshenyu
    • 2014/03/24 5:28下午

    其实花的时间主要在io上,因为数据量比较小,可以直接在内存里面排序,排序耗时是很短的。我看了下样例代码,天哪,你开那么多线程去排序有必要吗?真的有必要吗??多线程很多时候是用来平衡io和cpu的,当数据读进内存之后用太多的线程比单线程还要慢吧?!我试了一下,样例java代码用800+ms,而用单线程只用500+ms。。。

    • zwm512327
    • 2014/06/18 11:54上午

    这个数据量有点小吧,我直接用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.

    • liuxy
    • 2016/11/18 11:47上午

    开那么多的线程,去搞这么点数据的排序,是不是有点浪费?不过算法还是很好的

return top