前面我们比较了 muduo 和 libevent2 的吞吐量,得到的结论是 muduo 比 libevent2 快 18%。有人会说,libevent2 并不是为高吞吐的应用场景而设计的,这样的比较不公平,胜之不武。为了公平起见,这回我们用 libevent2 自带的性能测试程序(击鼓传花)来对比 muduo 和 libevent2 在高并发情况下的 IO 事件处理效率。

测试对象

  • libevent 2.0.6-rc, 源代码包 http://monkey.org/~provos/libevent-2.0.6-rc.tar.gz
  • muduo 0.1.2-alpha,源码 http://muduo.googlecode.com/files/muduo-0.1.2-alpha.tar.gz SHA1 Checksum: 9e7da4b46ad87602dd206eaedf54e67c17dfe4e1 。须编译为 release 版。

测试环境

测试用的软硬件环境与《muduo 与 boost asio 吞吐量对比》和《muduo 与 libevent2 吞吐量对比》相同,另外我还在自己的笔记本上运行了测试,结果也附在后面。

测试内容

测试的场景是:有 1000 个人围成一圈,玩击鼓传花的游戏,一开始第 1 个人手里有花,他把花传给右手边的人,那个人再继续把花传给右手边的人,当花转手 100 次之后游戏停止,记录从开始到结束的时间。

用程序表达是,有 1000 个网络连接 (socketpairs 或 pipes),数据在这些连接中顺次传递,一开始往第 1 个连接里写 1 个字节,然后从这个连接的另一头读出这 1 个字节,再写入第 2 个连接,然后读出来继续写到第 3 个连接,直到一共写了 100 次之后程序停止,记录所用的时间。

以上是只有一个活动连接的场景,我们实际测试的是 100 个或 1000 个活动连接(即 100 朵花或 1000 朵花,均匀分散在人群手中),而连接总数(即并发数)从 100 到 100,000 (十万)。注意每个连接是两个文件描述符,为了运行测试,需要调高每个进程能打开的文件数,比如设为 256000。

libevent2 的测试代码位于 test/bench.c,我修复了 2.0.6-rc 版里的一个小 bug,修正后的代码见 http://github.com/chenshuo/recipes/blob/master/pingpong/libevent/bench.c

muduo 的测试代码位于 examples/pingpong/bench.cc,见 http://gist.github.com/564985#file_pingpong_bench.cc

测试结果与讨论

第一轮,分别用 100 个活动连接和 1000 个活动连接,无超时,读写 100 次,测试一次游戏的总时间(包含初始化)和事件处理的时间(不包含注册 event watcher)随连接数(并发数)变化的情况。具体解释见 libev 的性能测试文档 http://libev.schmorp.de/bench.html ,不同之处在于我们不比较 timer event 的性能,只比较 IO event 的性能。对每个并发数,程序循环 25 次,刨去第一次的热身数据,后 24 次算平均值。测试用的脚本在 http://github.com/chenshuo/recipes/blob/master/pingpong/libevent/run_bench.sh 。这个脚本是 libev 的作者 Marc Lehmann 写的,我略作改用,用于测试 muduo 和 libevent2。

第一轮的结果,请先只看红线和绿线。红线是 libevent2 用的时间,绿线是 muduo 用的时间。数字越小越好。注意这个图的横坐标是对数的,每一个数量级的取值点为 1, 2, 3, 4, 5, 6, 7.5, 10。

从红绿线对比可以看出:

1. libevent2 在初始化 event watcher 上面比 muduo 快 20% (左边的两个图)

2. 在事件处理方面(右边的两个图):a) 在 100 个活动连接的情况下,libevent2 和 muduo 分段领先。当总连接数(并发数)小于 1000 时,二者性能差不多;当总连接数大于 30000 时,muduo 略占优;当总连接数大于 1000 小于 30000 时,libevent2 明显领先。b) 在 1000 个活动连接的情况下,当并发数小于 10000 时,libevent2 和 muduo 得分接近;当并发数大于 10000 时,muduo 明显占优。

这里我们有两个问题:1. 为什么 muduo 花在初始化上的时间比较多? 2. 为什么在一些情况下它比 libevent2 慢很多。

我仔细分析了其中的原因,并参考了 libev 的作者 Marc Lehmann 的观点 ( http://lists.schmorp.de/pipermail/libev/2010q2/001041.html ),结论是:在第一轮初始化时,libevent2 和 muduo 都是用 epoll_ctl(fd, EPOLL_CTL_ADD, …) 来添加 fd event watcher。不同之处在于,在后面 24 轮中,muduo 使用了 epoll_ctl(fd, EPOLL_CTL_MOD, …) 来更新已有的 event watcher;然而 libevent2 继续调用 epoll_ctl(fd, EPOLL_CTL_ADD, …) 来重复添加 fd,并忽略返回的错误码 EEXIST (File exists)。在这种重复添加的情况下,EPOLL_CTL_ADD 将会快速地返回错误,而 EPOLL_CTL_MOD 会做更多的工作,花的时间也更长。于是 libevent2 捡了个便宜。

为了验证这个结论,我改动了 muduo,让它每次都用 EPOLL_CTL_ADD 方式初始化和更新 event watcher,并忽略返回的错误。

第二轮测试结果见上图的蓝线,可见改动之后的 muduo 的初始化性能比 libevent2 更好,事件处理的耗时也有所降低(我推测是 kernel 内部的原因)。

这个改动只是为了验证想法,我并没有把它放到 muduo 最终的代码中去,这或许可以留作日后优化的余地。(具体的改动是 muduo/net/poller/EPollPoller.cc 第 115 行和 144 行,读者可自行验证。)

同样的测试在双核笔记本电脑上运行了一次,结果如下:(我的笔记本的 CPU 主频是 2.4GHz,高于台式机的 1.86GHz,所以用时较少。)

结论:在事件处理效率方面,muduo 与 libevent2 总体比较接近,各擅胜场。在并发量特别大的情况下(大于 10k),muduo 略微占优。

关于 muduo 的更多介绍请见《发布一个基于 Reactor 模式的 C++ 网络库》。muduo 的项目网站是 http://code.google.com/p/muduo ,上面有个 class diagram 可供参考。

转载于:https://www.cnblogs.com/Solstice/archive/2010/09/08/muduo_vs_libevent_bench.html

击鼓传花:对比 muduo 与 libevent2 的事件处理效率相关推荐

  1. 击鼓传花c语言编程题,c语言-第5章 循环程序设计.ppt

    <c语言-第5章 循环程序设计.ppt>由会员分享,可在线阅读,更多相关<c语言-第5章 循环程序设计.ppt(83页珍藏版)>请在人人文库网上搜索. 1.第5章 循环程序设计 ...

  2. 分享一个有意思题目--击鼓传花

    在看javaScript数据结构与算法这本书时,看到一个挺有意思的题目--击鼓传花 在这个游戏中,孩子们围成一个圆圈,把花尽快地传递给旁边的人.某一时刻传花停止, 这个时候花在谁手里,谁就退出圆圈结束 ...

  3. 击鼓传花击鼓次数相同c语言,击鼓传花

    游戏介绍:这是博客里流行的击鼓传花游戏,传给谁谁就得接着,否则就得挨罚.请认真对待,不要怕暴露隐私. 1.被点到名字的要在自己博客里写下自己的答案,然后去掉第一个问题,再加上一个问题,仍然组成4个问题 ...

  4. 三、队列:优先队列+循环队列(击鼓传花算法)

    队列: 队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序的项.队列在尾部添加新元素,并从顶部移除元素.最新添加的元素必须排在队列的末尾. 在现实中, ...

  5. 笔试题13——击鼓传花

    题目描述 学校联欢晚会的时候,为了使每一个同学都能参与进来,主持人常常会带着同学们玩击鼓传花的游戏.游戏规则是这样的:n个同学坐着围成一个圆圈,指定一个同学手里拿着一束花,主持人在旁边背对着大家开始击 ...

  6. JavaScript:队列的封装及面试题击鼓传花队列方法实现案例

    队列的定义:队列简称队.是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除.向队列中插入元素称为入队或进队:删除元素称为出队或离队.其操作特性为先进先出(First In Fir ...

  7. 数据结构之 击鼓传花

    2015/10/16/ ///by XBW// //环境  vs2013// 这是我们的数据结构的一个作业题,一个小作业之所以上博客,是希望在此mark一下,祭奠我失去的两天时光,以此警醒我要读明白题 ...

  8. c语言----击鼓传花

    有n个小朋友一圈,从1号开始传递,每次传递3个人,拿到花的小朋友表演节目后退出. 如1-5个小朋友,从1号开始传花,表演次序为3号,1号,5号,2号,4号. 5个小朋友击鼓传花 //击鼓传花 #inc ...

  9. 击鼓传花java_关于javascript:JavaScript-使用数据结构队列来实现击鼓传花

    击鼓传花游戏 原游戏规则: 班级中玩一个游戏,所有学生围成一圈,从某位同学手里开始向旁边的同学传一束花. 这个时候某个人(比方班长),在击鼓,鼓声停下的一刻,花落在谁手里,谁就进去表演节目 在编程中的 ...

最新文章

  1. Phoenix Tips (12) 跟踪 Tracing
  2. 数据中心液冷技术发展分析
  3. 面试题 16.18. Pattern Matching LCCI
  4. 配置VNC并远程控制服务器(电脑)
  5. java内存溢出分析工具:jmap使用实战
  6. c语言程序设李忠成主编答案,2007—2008学年第二学期基础学院上机课程表.doc
  7. 下三角矩阵的逆矩阵_上三角或下三角矩阵的逆矩阵能否简便方法求出??只有主副对角线不为0的矩阵能否直接写出逆矩阵。...
  8. 计算机毕业设计中用Java编写泛型与集合框架
  9. org.apache.ibatis.builder.BuilderException: An invalid property ‘jdbcType ‘ was found in mapping
  10. DNS在企业网络中的应用(一)
  11. linux系统管理Linux系统实验,实验三 linux系统管理.doc
  12. k8s搭建dashboard可视化界面
  13. JAVA删除文件或者文件夹
  14. FreeSwitch基础知识
  15. js 条码枪扫描_JavaScript 扫描枪使用(一)
  16. ape flac 音频截取_为什么选择FLAC音频
  17. U8根据发货单生成销售订单(反向生单)
  18. 机械臂运动学入门(二)
  19. Faceless —— 开源的匿名社交应用
  20. 数据库空间管理-学习笔记

热门文章

  1. 把图片隐藏起来的html代码,教你把图片、文档、影片等隐藏起来
  2. 系统学习深度学习(四十一)--AlphaGo Zero强化学习原理
  3. 运动目标跟踪(九)--Struck跟踪原理
  4. P.Laguna/AUTOMATIC DETECTION OF WAVE BOUNDARIES IN MULTILEAD ECG SIGNALS VALIDATION WITH THE CSE DB
  5. 国外免费服务器 win系统,FreeSSHd一个免费的SSH服务器的Windows | MOS86
  6. Ubuntu16.04安装Mono4.2.1 C#开发环境
  7. 怎么用java做todolist_[Java教程]JavaScript jQuery 任务清单 ToDoList
  8. Hive中Join的 MR 底层原理
  9. spark reduce与reduceByKey的区别
  10. Linux下使用exec命令将文件与文件描述符关联