muduo 与 boost asio 吞吐量对比

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 下载。

测试结果

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

时间: 2024-10-27 13:55:36

muduo 与 boost asio 吞吐量对比的相关文章

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:

boost::asio译文

Christopher Kohlhoff Copyright 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_0.txt文件或从http://www.boost.org/LICENSE_1_0.txt) Boost.Asio是用于网络和低层IO编程的跨平台C++库,为开发者提供了C++环境下稳定的异步模型. 综述 基本原理 应用程序与外界交互的方式有很多,可通过文件,网络,串口或控制台.例如在网络通信中,完成独

Muduo 网络编程示例(二) Boost.Asio 的聊天服务器

本文讲介绍一个与 Boost.Asio 的示例代码中的聊天服务器功能类似的网络服务程序,包括客户端 与服务端的 muduo 实现.这个例子的主要目的是介绍如何处理分包,并初步涉及 Muduo 的多线程功能 .Muduo 的下载地址: http://muduo.googlecode.com/files/muduo-0.1.7-alpha.tar.gz ,SHA1 873567e43b3c2cae592101ea809b30ba730f2ee6,本文的完整代码可在线阅读 http://code.go

boost asio中io_service类的几种使用

io_service类 你应该已经发现大部分使用Boost.Asio编写的代码都会使用几个io_service的实例.io_service是这个库里面最重要的类:它负责和操作系统打交道,等待所有异步操作的结束,然后为每一个异步操作调用其完成处理程序.如果你选择用同步的方式来创建你的应用,你则不需要考虑我将在这一节向你展示的东西. 你有多种不同的方式来使用io_service.在下面的例子中,我们有3个异步操作,2个socket连接操作和一个计时器等待操作:有一个io_service实例和一个处理

boost asio-#include<boost/asio>运行不成功

问题描述 #include<boost/asio>运行不成功 #include"stdafx.h" #include int _tmain(int argc, _TCHAR* argv[]) { return 0; } 编译时成功,运行时弹出一个框框, Unable to start program. 我下的是boost的二进制可执行文件,且在vs2005上已经包含了头文件和库文件,将#include换成#include或者其他就能运行成功,这是什么原因呢 解决方案 boo

boost.asio包装类st_asio_wrapper开发教程(2014.5.23更新)(一)-----转

一:什么是st_asio_wrapper它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_wrapper的特点效率高.跨平台.完全异步,当然这是从boost.asio继承而来:自动重连,数据透明传输,自动解决分包粘包问题(必须使用默认的打包解包器,这一特性表现得与udp一样):只支持tcp和udp协议: 三:st_asio_wrapper的大体结构st_asio_wrapper.h:编译器

linux下eclipse使用boost asio进行网络开发

问题描述 linux下eclipse使用boost asio进行网络开发 我按照官方文档编译了boost库并安装,然后我的eclipse工程下的/usr/local/include底下已经有了boost 接着我编译官网上的例子: #include #include #include using namespace std; using namespace boost; int main() { boost::asio::io_service io; boost::asio::deadline_t

boost asio 中见到的一些c++语法wenti

问题描述 boost asio 中见到的一些c++语法wenti 我在boost asio的demo中见到一些如下的写法,请问这种写法[this, self]是什么意思 boost::asio::async_read(socket_, boost::asio::buffer(read_msg_.data(), chat_message::header_length), [this, self](boost::system::error_code ec, std::size_t /*length*

boost::asio的http client应用笔记

1 踩过的坑 1.1 io_service boost::asio::io_service::run()会一直运行到没有任务为止,如果中途调用stop(),则所有等待中的任务会立刻执行.要在停止的时候抛弃所有的任务,解决方案是用run_one(),即 while (keep_running) io_service_.run_one(); keep_running是个bool值,要stop io_service的时候直接置false即可. 1.2 deadline_timer 在调用async_w