muduo (http://code.google.com/p/muduo) 是一个基于 Reactor 模式的 C++ 网络库,我在编写它的时候并没有以高并发高吞吐为主要目标,但出乎我的意料,ping pong 测试表明,muduo 吞吐量比 boost.asio 高 15% 以上。

测试对象

  • boost 1.40 中的 asio 1.4.3
  • asio 1.4.5 (http://think-async.com/Asio/Download)
  • muduo 0.1.1 (http://muduo.googlecode.com/files/muduo-0.1.1-alpha.tar.gz) SHA1 Checksum: a446ea8a22915f439063d2bc52eb2dc4b9caf92d

测试环境

硬件:DELL 490 工作站,双路 Intel quad core Xeon E5320 CPU,16G 内存

操作系统:Ubuntu Linux Server 10.04.1 LTS x86_64

编译器:g++ 4.4.3

测试方法

依据 asio 性能测试 http://think-async.com/Asio/LinuxPerformanceImprovements 的办法,用 ping pong 协议来测试吞吐量。

简单地说,ping pong 协议是客户端和服务器都实现 echo 协议。当 TCP 连接建立时,客户端向服务器发送一些数据,服务器会 echo 回这些数据,然后客户端再 echo 回服务器。这些数据就会像乒乓球一样在客户端和服务器之间来回传送,直到有一方断开连接为止。这是用来测试吞吐量的常用办法。

asio 的测试代码取自 http://asio.cvs.sourceforge.net/viewvc/asio/asio/src/tests/performance/ ,未作更改。

muduo 的测试代码在 0.1.1 软件包内,路径为 examples/pingpong/,代码如 http://gist.github.com/564985 所示。

muduo 和 asio 的优化编译参数均为 -O2 -finline-limit=1000

$ BUILD_TYPE=release ./build.sh  # 编译 muduo 的优化版本

我主要做了两项测试:

  • 单线程测试,测试并发连接数为 1/10/100/1000/10000 时的吞吐量。
  • 多线程测试,并发连接数为 100 或 1000,服务器和客户端的线程数同时设为 1/2/3/4。(由于我家里只有一台 8 核机器,而且服务器和客户端运行在同一台机器上,线程数大于 4 没有意义。)

所有测试中,ping pong 消息的大小均为 16k bytes。测试用的 shell 脚本可从 http://gist.github.com/564985 下载。

测试结果

单线程测试的结果,数字越大越好:

多线程测试的结果,数字越大越好:

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

讨论

muduo 出乎意料地比 asio 性能优越,我想主要得益于其简单的设计和简洁的代码。

asio 在多线程测试中表现不佳,我猜测其主要原因是测试代码只使用了一个 io_service,如果改用“io_service per CPU”的话,性能应该有所提高。我对 asio 的了解程度仅限于能读懂其代码,希望能有 asio 高手编写“io_service per CPU”的 ping pong 测试,以便与 muduo 做一个公平的比较。

ping pong 测试很容易实现,欢迎其他网络库(ACE、POCO、libevent 等)也能加入到对比中来,期待这些库的高手出马。

muduo 与 boost asio 吞吐量对比相关推荐

  1. boost::asio译文

    boost::asio译文 Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布( ...

  2. Boost.Asio技术文档汇总

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  3. boost::asio中文文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  4. Boost.Asio技术文档

    文章来源:http://blog.csdn.net/henreash/article/details/7469707 Boost.Asio是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手 ...

  5. Boost.Asio 技术文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  6. Boost.Asio,libevent和ACE之间关于Socket编程的比较(★firecat推荐★)

    文章来源:http://blog.163.com/miky_sun/blog/static/3369405201041753652505/ ACE官网 http://download.dre.vand ...

  7. Boost asio学习笔记之一—— 使用strand支持多线程调用service_io的方法

    asio是一个跨平台的网络库,可以作为boost的一部分,也可以使用独立的asio部分.这里记录学习的笔记,作为参考. 感觉asio的关键就是io_service对象.所有的异步同步都跟这个有关.多线 ...

  8. boost::asio使用UDP协议通信源码实现

    说明:以下源码来自参考文献[1], 比原文更丰富, 更有指导意义, 方便日后参考. udp servr端源码 //g++ -g udp_server.cpp -o udp_server -lboost ...

  9. boost::asio异步模式的C/S客户端源码实现

    异步模式的服务器源码 //g++ -g async_tcp_server.cpp -o async_tcp_server -lboost_system //#include <iostream& ...

最新文章

  1. Android程序反编译
  2. ios nstimer实现延时_IOS_IOS开发代码分享之用nstimer实现倒计时功能,用nstimer实现倒计时功能,废话 - phpStudy...
  3. python中的协程:greenlet和gevent
  4. 纪事本 乱码_纪事日记–可自定义的数据存储
  5. VB后台获得按键,并执行自己的函数(非钩子及热键)
  6. 在Master page 里 CompositeControl 的事件失效了
  7. MLPlatform project的统一结构-----------Model层代码编写--------业务逻辑子层:编程思路...
  8. 关于thymeleaf 遍历 List<Map<String,Object>> 类型数据
  9. 凯撒密码加密算法python_想偷WiFi?万能钥匙不行?试试python一键破解!|wifi|python|profile|算法|无线网卡...
  10. android 设备管理和凭证,简述设备管理的涵义
  11. linux飞信机器人,在Nagios使用飞信机器人发送警报
  12. 盘古开发框架集成 ShenYu 网关实现 Dubbo 泛化调用
  13. 制造业生产过程中多源异构数据处理方法综述
  14. VirtualBox升级VirtualBox Guest Additions增强功能
  15. 双语不用教 下载地址!!!
  16. 【无标题】程序员的一大步
  17. 目不暇接 时尚艳丽的新款苹果手机 MAC APPLE
  18. db(德邦快递单号查询)
  19. 显示器还有卖的吗_[电脑]显示器参数被乱标?深度体验ThinkVision顶级超宽带鱼屏显示器...
  20. 2019年科协宣传部第一次培训

热门文章

  1. 数据库字符mysql_MySQL数据库之字符函数详解
  2. sqlite3 多线程 c语言,sqlite3 c语言编程 之 三个基本函数
  3. Other Linker Flags参数 -ObjC、-all_load和-force_load
  4. 打开共享文件闪退怎么解决_文件共享解决方案-随时随地共享同步访问文件
  5. html怎么将旋转定位在中心,html – 定位旋转的div元素
  6. 三星note5 android版本区别吗,三星Note5哪种颜色好看?三星Note5四种颜色区别对比图解...
  7. android x86小白安装教程,小白的教程,在windows上安装完美的Android手机驱动
  8. java jnlp被阻止_JNLP应使用特定的Java版本,但会出现错误结果
  9. python 读取图片成为一维数组_python+opencv 图像的数组和矩阵操作
  10. 前端遍历列表生成表格_源码剖析狗屁不通文章生成器