当前位置: 首页 > news >正文

muduo 与 libevent2 吞吐量对比

libevent 是一款非常好用的 C 语言网络库,它也采用 Reactor 模型,正好可以与 muduo 做一对比。

本文用 ping pong 测试来对比 muduo 和 libevent2 的吞吐量,测试结果表明 muduo 吞吐量平均比 libevent2 高 18% 以上,个别情况达到 70%。

测试对象

  • libevent 2.0.6-rc (http://monkey.org/~provos/libevent-2.0.6-rc.tar.gz)
  • muduo 0.1.1 (http://muduo.googlecode.com/files/muduo-0.1.1-alpha.tar.gz) SHA1 Checksum: a446ea8a22915f439063d2bc52eb2dc4b9caf92d

测试环境与测试方法

测试环境与前文《muduo 与 boost asio 吞吐量对比》相同。

我自己编写了 libevent2 的 ping pong 测试代码,地址在 http://github.com/chenshuo/recipes/tree/master/pingpong/libevent/ 。由于这个测试代码没有使用多线程,所以本次测试只对比单线程下的性能。

测试内容为:客户端与服务器运行在同一台机器,均为单线程,测试并发连接数为 1/10/100/1000/10000 时的吞吐量。

在同一台机器测试吞吐量的原因:

  • 现在的 CPU 很快,即便是单线程单 TCP 连接也能把 Gigabit 以太网的带宽跑满。如果用两台机器,所有的吞吐量测试结果都将是 100 MiB/s,失去了对比的意义。(或许可以对比哪个库占的 CPU 少。)
  • 在同一台机器上测试,可以在 CPU 资源相同的情况下,单纯对比网络库的效率。也就是说单线程下,服务端和客户端各占满 1 个 CPU,比较哪个库的吞吐量高。

测试结果

单线程吞吐量测试,数字越大越好:

muduo_libevent_16k

以上结果让人大跌眼镜,muduo 居然比 libevent 快 70%!跟踪 libevent2 的源代码发现,它每次最多从 socket 读取 4096 字节的数据 (证据在 buffer.c 的 evbuffer_read() 函数),怪不得吞吐量比 muduo 小很多。因为在这一测试中,muduo 每次读取 16384 字节,系统调用的性价比较高。

buffer.c:#define EVBUFFER_MAX_READ      4096

为了公平起见,我再测了一次,这回两个库都发送 4096 字节的消息。

muduo_libevent_4k

测试结果表明 muduo 吞吐量平均比 libevent2 高 18% 以上。

讨论

由于 libevent2 每次最多从网络读取 4096 字节,大大限制了它的吞吐量。

转载于:https://www.cnblogs.com/Solstice/archive/2010/09/05/muduo_vs_libevent.html

相关文章:

  • TabController控件测试
  • 第13届年度Webby奖采用Silverlight / 13th Annual Webby Awards powered by Silverlight
  • 网页-CSS
  • 王德兴读《吴越品水浒》有感15:吴越对“鲁智深出家”的无知和诬蔑
  • C#读取特定目录下的所有文件
  • debug下运行不成功
  • [转]Apache虚拟目录设置方法
  • 11个IT人士必备的Chrome 插件
  • javascript对象转化成json字符串
  • ffmpeg_intra_pred_mode问题.pdf
  • 全局原子应用之防止程序多开
  • 学习LoadRunner之C语言函数
  • .NET : 在VS2008中计算代码度量值
  • Ctrl+F5运行崩溃,而用F5调试运行没有问题
  • 我的关节炎给我的提示
  • 【译】JS基础算法脚本:字符串结尾
  • Android优雅地处理按钮重复点击
  • cookie和session
  • Java 网络编程(2):UDP 的使用
  • Mac转Windows的拯救指南
  • Map集合、散列表、红黑树介绍
  • oschina
  • Vue全家桶实现一个Web App
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 动态魔术使用DBMS_SQL
  • 猴子数据域名防封接口降低小说被封的风险
  • 技术发展面试
  • 开源SQL-on-Hadoop系统一览
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端js -- this指向总结。
  • 区块链将重新定义世界
  • 由插件封装引出的一丢丢思考
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • # Maven错误Error executing Maven
  • #includecmath
  • $jQuery 重写Alert样式方法
  • (1)(1.13) SiK无线电高级配置(六)
  • (c语言)strcpy函数用法
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (四)Android布局类型(线性布局LinearLayout)
  • ***检测工具之RKHunter AIDE
  • *2 echo、printf、mkdir命令的应用
  • .bat批处理(六):替换字符串中匹配的子串
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net core 控制台应用程序读取配置文件app.config
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net 使用ajax控件后如何调用前端脚本
  • .NET 事件模型教程(二)
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • @Bean, @Component, @Configuration简析
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)