muduo 与 libevent2 吞吐量对照

libevent 是一款很好用的 C 语言网络库,它也採用 Reactor 模型,正好能够与 muduo 做一对照。

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

測试对象

測试环境与測试方法

測试环境与前文《muduo 与 boost asio 吞吐量对照》同样。

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

測试内容为:client与server执行在同一台机器,均为单线程,測试并发连接数为 1/10/100/1000/10000 时的吞吐量。

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

  • 如今的 CPU 非常快,即便是单线程单 TCP 连接也能把 Gigabit 以太网的带宽跑满。假设用两台机器,全部的吞吐量測试结果都将是 100 MiB/s,失去了对照的意义。(也许能够对照哪个库占的 CPU 少。)
  • 在同一台机器上測试,能够在 CPU 资源同样的情况下,单纯对照网络库的效率。也就是说单线程下,服务端和client各占满 1 个 CPU,比較哪个库的吞吐量高。

測试结果

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

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

buffer.c:#define EVBUFFER_MAX_READ      4096

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

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

讨论

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

时间: 2024-10-15 20:55:58

muduo 与 libevent2 吞吐量对照的相关文章

Linux多线程服务端编程:使用muduo C++网络库

内容推荐本 书主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread.这是在Linux下以native语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的服务端网络应用程序.本书以 muduo网络库为例,讲解这种编程模型的使用方法及注意事项.本书的宗旨是贵精不贵多.掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出更易用的同步设施.掌

Muduo 设计与实现之一:Buffer 类的设计

[开源访谈]Muduo 作者陈硕访谈实录 http://www.oschina.net/question/28_61182 开源访谈是开源中国推出的一系列针对国内优秀开源软件作者的访谈,以文字的方式记录并传播.我们希望开源访谈能全面的展现国内开源软件.开源软件作者的现状,着实推动国内开源软件的应用与发展. [嘉宾简介] 陈硕 北京师范大学硕士,擅长 C++ 多线程网络编程和实时分布式系统架构.现任职于香港某跨国金融公司 IT 部门,从事实时外汇交易系统开发.编写了开源 C++ 网络库 muduo

计算机专业术语对照

# 计算机专业术语对照 ## 0-9 ## A ## access,获取,存取  acoustic coupler,声音耦合器  Active Directory,活动目录  ADSL,Asymmetrical Dingital Subscriber Loop,非对称数字用户环线  affinity,绑定  affinity group,地缘组  agent,代理  agent-based interface,代理人界面  agility,敏捷性  AI,Artificial Intellige

系统吞吐量、TPS(QPS)、用户并发量、性能測试概念和公式

PS:以下是性能測试的主要概念和计算公式,记录下: 一.系统吞度量要素: 一个系统的吞度量(承压能力)与request对CPU的消耗.外部接口.IO等等紧密关联.单个reqeust 对CPU消耗越高,外部系统接口.IO影响速度越慢.系统吞吐能力越低,反之越高. 系统吞吐量几个重要參数:QPS(TPS).并发数.响应时间 QPS(TPS):每秒钟request/事务 数量 并发数: 系统同一时候处理的request/事务数 响应时间:  一般取平均响应时间 (非常多人常常会把并发数和TPS理解混淆

HBase与MongDB等NoSQL数据库对照

HBase概念学习(十)HBase与MongDB等NoSQL数据库对照 转载请注明出处: jiq?钦's technical Blog - 季义钦 一.开篇 淘宝之前使用的存储层架构一直是MySQL数据库,配合以MongDB,Tair等存储. MySQL因为开源,而且生态系统良好,本身拥有分库分表等多种解决方式,因此非常长一段时间内都满足淘宝大量业务的需求.可是因为业务的多样化发展,有越来越多的业务系统的需求開始发生了变化.一般来说有下面几类变化: (1)    数据量变得越来越多,其实如今淘宝

性能测试之QPS、TPS、并发量、系统吞吐量的概念

QPS: 每秒钟处理完请求的次数:具体是指发出请求到服务器处理完成功返回结果. TPS:每秒钟处理完的事务次数,一般TPS是对整个系统来讲的.一个应用系统1s能完成多少事务处理,一个事务在分布式处理中,可能会对应多个请求,对于衡量单个接口服务的处理能力,用QPS比较多. 并发量:系统能同时处理的请求数 RT:响应时间,处理一次请求所需要的平均处理时间 计算关系: QPS = 并发量 / 平均响应时间 并发量 = QPS * 平均响应时间 TPS: (每秒事务处理量(TransactionPerS

muduo::thread类分析

在看源代码前,先学习一个关键字:__thread. 线程共享进程的数据,如果想要每个线程都有一份独立的数据,那么可以使用__thread关键字修饰数据. __thread只能用于修饰POD类型的数据,不能修饰class,因为它无法调用构造函数和析构函数.__thread可以修饰全局变量.函数内的静态变量,不能修饰函数内的局部变量或class的普通成员变量. 在muduo/base/thread.{h, cc}中实现了线程的封装.thread的封装和一个命名空间muduo::CurrentThre

css font-family常用的黑体宋体等字体中英文对照

在实现网页效果时,细节很重要,字体也不例外,CSS:font-family常用字体中英文对照如下: 微软雅黑: Microsoft YaHei 宋体:SimSun 黑体:SimHei 仿宋: FangSong 楷体:  KaiTi 隶书:LiSu 幼圆:YouYuan 华文细黑:STXihei 华文楷体:STKaiti 华文宋体:STSong 华文中宋:STZhongsong 华文仿宋:STFangsong 方正舒体:FZShuTi 方正姚体:FZYaoti 华文彩云:STCaiyun 华文琥珀

BZOJ 3931: [CQOI2015]网络吞吐量

3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1555  Solved: 637[Submit][Status][Discuss] Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发数据包.例如在常用的路由算法OSPF(开放式最短路径优先)中