免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2787 | 回复: 7

简单测试了一下Coro的性能 [复制链接]

论坛徽章:
0
发表于 2009-12-20 15:44 |显示全部楼层
第一次用Coro,代码写得很搓,所以测试出来结果很糟糕。

  1. [yunshu@alisec ~]$ ./lwp.pl
  2. Benchmark: timing 20 iterations of Coro_cede, Coro_nocede, Single...
  3. coro cede: 6.49081897735596
  4. coro cede: 6.15217590332031
  5. coro cede: 6.05628800392151
  6. coro cede: 6.21107196807861
  7. coro cede: 6.00841999053955
  8. coro cede: 6.26581907272339
  9. coro cede: 6.17434310913086
  10. coro cede: 6.00813794136047
  11. coro cede: 6.1951699256897
  12. coro cede: 6.06605410575867
  13. coro cede: 5.94637799263
  14. coro cede: 6.03272008895874
  15. coro cede: 5.96221017837524
  16. coro cede: 6.13361597061157
  17. coro cede: 5.86121511459351
  18. coro cede: 6.28835797309875
  19. coro cede: 5.88967108726501
  20. coro cede: 6.08243489265442
  21. coro cede: 6.15819191932678
  22. coro cede: 6.04327797889709
  23. Coro_cede: 122 wallclock secs ( 5.32 usr +  0.60 sys =  5.92 CPU) @  3.38/s (n=20)
  24. coro no cede: 9.09577894210815
  25. coro no cede: 6.05727195739746
  26. coro no cede: 5.76734018325806
  27. coro no cede: 9.02401900291443
  28. coro no cede: 5.81625485420227
  29. coro no cede: 5.86933517456055
  30. coro no cede: 5.99138998985291
  31. coro no cede: 6.11405181884766
  32. coro no cede: 5.76704406738281
  33. coro no cede: 6.13680291175842
  34. coro no cede: 8.82450413703918
  35. coro no cede: 6.01463413238525
  36. coro no cede: 6.02665209770203
  37. coro no cede: 6.03721284866333
  38. coro no cede: 5.83429312705994
  39. coro no cede: 6.11594295501709
  40. coro no cede: 5.95029497146606
  41. coro no cede: 6.00661706924438
  42. coro no cede: 5.88391184806824
  43. coro no cede: 6.03061604499817
  44. Coro_nocede: 128 wallclock secs ( 5.19 usr +  0.60 sys =  5.79 CPU) @  3.45/s (n=20)
  45. single: 5.75780200958252
  46. single: 6.01135516166687
  47. single: 5.89875817298889
  48. single: 5.99776697158813
  49. single: 6.0035080909729
  50. single: 6.08962893486023
  51. single: 6.12317204475403
  52. single: 6.15343594551086
  53. single: 6.19344115257263
  54. single: 6.09869790077209
  55. single: 5.82484889030457
  56. single: 6.16173100471497
  57. single: 5.86830401420593
  58. single: 6.08909893035889
  59. single: 5.88979601860046
  60. single: 6.01710295677185
  61. single: 5.99976301193237
  62. single: 6.0466160774231
  63. single: 5.76599287986755
  64. single: 6.08541393280029
  65.     Single: 120 wallclock secs ( 5.12 usr +  0.57 sys =  5.69 CPU) @  3.51/s (n=20)
  66.               Rate   Coro_cede Coro_nocede      Single
  67. Coro_cede   3.38/s          --         -2%         -4%
  68. Coro_nocede 3.45/s          2%          --         -2%
  69. Single      3.51/s          4%          2%          --
  70. [yunshu@alisec ~]$
复制代码


测试代码如下:

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use LWP::Simple;
  5. use Web::Scraper;
  6. use Coro;
  7. use Time::HiRes;
  8. use Benchmark qw(timethese cmpthese);

  9. my $scraper = scraper {
  10.     process '//a', 'links[]' => '@href';
  11. };
  12. my $res     = $scraper->scrape(URI->new('http://www.soso.com'));
  13. my @links   = @{ $res->{links} };

  14. my $result = timethese(20, {
  15.     Single => 'do_single',
  16.     Coro_cede => 'do_coro',
  17.     Coro_nocede => 'do_no_cede',
  18. });

  19. cmpthese($result);

  20. sub do_single {
  21.     my $t = Time::HiRes::time;

  22.     foreach my $link (@links) {
  23.         my $content = get $link;
  24.     }
  25.     print "single: ", Time::HiRes::time - $t, "\n";
  26. }

  27. sub do_coro {
  28.     my $t = Time::HiRes::time;

  29.     my @coros = ( );
  30.     foreach my $link (@links) {
  31.         push( @coros,
  32.             async {
  33.                 my $l = shift;
  34.                 cede;
  35.                 my $content = get $l;
  36.             } $link
  37.         );
  38.     }
  39.     cede;
  40.     foreach (@coros) {
  41.         $_->join();
  42.     }
  43.     print "coro cede: ", Time::HiRes::time - $t, "\n";
  44. }

  45. sub do_no_cede {
  46.     my $t = Time::HiRes::time;

  47.     my @coros = ( );
  48.     foreach my $link (@links) {
  49.         push( @coros,
  50.             async {
  51.                 my $content = get $link;
  52.             }
  53.         );
  54.     }

  55.     foreach (@coros) {
  56.         $_->join();
  57.     }
  58.     print "coro no cede: ", Time::HiRes::time - $t, "\n";
  59. }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2009-12-20 16:44 |显示全部楼层
看起来用法似乎有些不对的呢。

应该是先 use Coro::LWP;
然后 use Coro;
最后才 use LWP::Simple 或者 Web::Scraper 一类的。

论坛徽章:
0
发表于 2009-12-20 16:49 |显示全部楼层
我这个测试主要不是为了非阻塞的LWP,而是对比一下多个例程和没有使用多例程的效率。我再试试非阻塞的LWP。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2009-12-20 16:55 |显示全部楼层
原帖由 撒哈拉里的鱼 于 2009-12-20 16:49 发表
我这个测试主要不是为了非阻塞的LWP,而是对比一下多个例程和没有使用多例程的效率。我再试试非阻塞的LWP。

Coro 本来就是单线程的东西,如果不用非阻塞,甭指望它能提高效率。

论坛徽章:
0
发表于 2009-12-20 19:42 |显示全部楼层
确实,根据后来的测试看来协程本身对性能提升没有好处,有用的是非阻塞。
有意思的是,URL不多时使用多线程并不比单线程快,可能是因为线程切换的原因吧。
空了我仔细看看。

[ 本帖最后由 撒哈拉里的鱼 于 2009-12-20 19:44 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2009-12-20 19:47 |显示全部楼层
原帖由 撒哈拉里的鱼 于 2009-12-20 19:42 发表
确实,根据后来的测试看来协程本身对性能提升没有好处,有用的是非阻塞。
有意思的是,URL不多时使用多线程并不比单线程快,可能是因为线程切换的原因吧。
空了我仔细看看。

Coro 根本就不是多线程。

论坛徽章:
0
发表于 2009-12-20 19:55 |显示全部楼层
不是,我的意思是说我也顺便测试了threads。

论坛徽章:
0
发表于 2009-12-20 22:26 |显示全部楼层
Coro_cede: 17 wallclock secs ( 4.54 usr +  0.44 sys =  4.98 CPU) @  2.01/s (n=10)
Coro_nocede: 18 wallclock secs ( 4.54 usr +  0.41 sys =  4.95 CPU) @  2.02/s (n=10)
Single: 90 wallclock secs ( 4.68 usr +  0.44 sys =  5.12 CPU) @  1.95/s (n=10)
Threads: 23 wallclock secs (21.37 usr +  2.13 sys = 23.50 CPU) @  0.43/s (n=10)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP