muduo 与 libevent2 吞吐量对比

简介:

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/ 。由于这个测试代码没有使用多线程,所以本次测试只对比单线程下的性能。

测试内容为:客户端与服务器运行在同一台机器,均为单线程,测试并发连接数为 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% 以上。





    本文转自 陈硕  博客园博客,原文链接:http://www.cnblogs.com/Solstice/archive/2010/09/05/muduo_vs_libevent.html,如需转载请自行联系原作者



相关文章
|
存储 缓存 前端开发
muduo高性能异步日志库的实现
muduo高性能异步日志库的实现
293 0
|
1月前
|
负载均衡 算法 Go
GoLang协程Goroutiney原理与GMP模型详解
【11月更文挑战第4天】Goroutine 是 Go 语言中的轻量级线程,由 Go 运行时管理,创建和销毁开销小,适合高并发场景。其调度采用非抢占式和协作式多任务处理结合的方式。GMP 模型包括 G(Goroutine)、M(系统线程)和 P(逻辑处理器),通过工作窃取算法实现负载均衡,确保高效利用系统资源。
|
6月前
|
Java C++ 开发者
muduo网络库
【6月更文挑战第15天】
85 7
|
7月前
|
NoSQL Java Linux
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
207 0
|
7月前
|
API
muduo源码剖析之poller/EpollPoller多路复用类
poller是I/O多路复用接口抽象虚基类,对I/O多路复用API的封装,muduo提供了EPollPoller和PollPoller派生类(epoll和poll),所以不支持select.newDefaultPoller()默认选择epoll。
87 0
|
7月前
|
Unix Linux API
高性能网络编程 - select、 poll 、epoll 、libevent
高性能网络编程 - select、 poll 、epoll 、libevent
97 0
|
存储 缓存 JavaScript
libevent实战的那些坑
libevent实战的那些坑
465 0
libevent实战的那些坑
|
缓存 并行计算 算法
Golang面试前三夜准备:Goroutine调度器GMP为何需要P?不需要会怎样?
Golang面试前三夜准备:Goroutine调度器GMP为何需要P?不需要会怎样?
|
网络协议 NoSQL 关系型数据库
《Linux多线程服务端编程:使用muduo C++网络库》学习笔记,★firecat推荐★
《Linux多线程服务端编程:使用muduo C++网络库》学习笔记,★firecat推荐★
435 0
《Linux多线程服务端编程:使用muduo C++网络库》学习笔记,★firecat推荐★
|
Go
Golang高并发:生产者消费者模型
Golang高并发:生产者消费者模型
1748 0