转:开源C++库比较
2012年01月13日
原文:
http://blog.csdn.net/langeldep/article/details/6976120
在开源的C/C++网络库中, 常用的就那么几个, 在业界知名度最高的, 应该是ACE了, 不过是个重量级的大家伙, 轻量级的有libevent, libev, 还有 Boost的ASIO。
ACE是一个大型的中间件产品,代码20万行左右,过于宏大,一堆的设计模式,架构了一层又一层,使用的时候, 要根据情况,看你从那一层来进行使用。支持跨平台。
Boost的ASIO是一个异步IO库,封装了对Socket的常用操作,简化了基于socket程序的开发。支持跨平台。
libevent是一个C语言写的网络库, 官方主要支持的是类linux 操作系统, 最新的版本添加了对windows的IOCP的支持。由于IOCP是异步IO,与linux下的POLL模型,EPOLL模型,还有freebsd的KQUEUE等这些同步模型在用法上完全不一致,所以使用方法也不一样,就好比ACE中的Reactor和Proactor模式一样, 使用起来需要转变思路。如果对性能没有特别的要求, 那么使用libevent中的select模型来实现跨平台的操作, select模型可以横跨windows, linux, unix,solaris等系统。
libev是一个C语言写的,只支持linux系统的库,我以前研究的时候只封装了EPOLL模型, 不知道现在的新版有没有改进。使用方法类似libevent, 但是非常简洁,代码量是最少的一个库,也就几千行代码。显然这样的代码跨平台肯定是无法支持的了, 如果你只需要在linux下面运行,那用这个库也是可以的。
ACE网络库在使用中,一直对其中的内存管理搞得一头雾水,分配的内存需要在哪里释放都不知道,ACE不愧是一个做研究用的库, 可以说里面的封装把设计模式这本书中列出的模式都在代码里面实现了一番,用起来感觉是在用java一样,如果你想使用ACE作为你的网络库, 千万不要仅仅把它当成一个网络库使用, 你要把它当成一个框架来使用,如果你只想用它的网络库, 那大可不必用ACE, 因为它太庞大了,学习起来太费劲。但是你把它当成一个框架来用,你会感觉用的还真爽,该有的东西都有,比如线程池,内存池,定时器,递归锁等,都很方便的。Boost的ASIO,在内存管理方面要直观的多。下面简单地与ACE做个比较。
1.层次架构:
ACE底层是C风格的OS适配层,上一层基于C++的wrap类,再上一层是一些框架(Accpetor, Connector,Reactor,Proactor等),最上一层是框架上服务。
Boost.ASIO与之类似,底层是OS的适配层,上一层一些模板类,再上一层模板类的参数化(TCP/UDP),再上一层是服务,它只有一种框架为io_service。
livevent在不同的操作系统下,做了多路复用模型的抽象,可以选择使用不同的模型,通过事件函数提供服务。
2.涉及范围:
ACE包含了日志,IPC,线程池,共享内存,配置服务,递归锁,定时器等。
ASIO只涉及到Socket,提供简单的线程操作。
libevent只提供了简单的网络API的封装, 线程池, 内存池, 递归锁等均需要自己实现。
3.设计模式:
ACE主要应用了Reactor,Proactor等。
而ASIO主要应用了Proactor。
libevent为Reactor模式
4.线程调度:
ACE的Reactor是单线程调度,Proactor支持多线程调度。
ASIO支持单线程与多线程调度。
libevent的线程调度需要自己来注册不同的事件句柄。
5.事件分派处理:
ACE主要是注册handler类,当事件分派时,调用其handler的虚挂勾函数。实现ACE_Handler / ACE_Svc_Handler / ACE_Event_handler等类的虚函数。
ASIO是基于函数对象的hanlder事件分派。任何函数都可能成为hanlder,少了一堆虚表的维护,调度上优于ACE。
libevent基于注册的事件回调函数来实现事件分发。
6.发布方式:
ACE是开源免费的,不依赖于第3方库, 一般应用使用它时,以动态链接的方式发布动态库。
ASIO是开源免费的,依赖Boost,应用使用时只要include头文件,不需动态库。
libevent为开源免费的,一般编译为静态库进行使用。
7.可移植性:
ACE支持多种平台,可移植性不存在问题,据说socket编程在linux下有不少bugs。
ASIO支持多种平台,可移植性不存在问题。
libevent主要支持linux平台,freebsd平台, 其他平台下通过select模型进行支持, 效率不是太高。
8.开发难度:
基于ACE开发应用,对程序员要求比较高,要用好它,必须非常了解其框架。在其框架下开发,往往new出一个对象,不知在什么地方释放好。
基于ASIO开发应用,要求程序员熟悉函数对象,函数指针,熟悉boost库中的boost::bind。内存管理控制方面。
基于libevent开发应用,相对容易, 具体大家可以参考memcached这个开源的应用,里面使用了libevent这个库。
发表评论
-
从PC总线的发展看设备驱动程序的发展
2012-01-20 09:03 748从PC总线的发展看设备驱动程序的发展 2010年06月03日 ... -
进程间通信
2012-01-20 09:03 767进程间通信 2010年09月12 ... -
深入浅出Win32多线程程序设计之(五):综合实例
2012-01-20 09:03 746深入浅出Win32多线程程 ... -
Xen实践手册
2012-01-20 09:03 856Xen实践手册 2011年03月25日 一、Xen的安装 ... -
.net中加密和解密的实现方法
2012-01-20 09:03 559.net中加密和解密的实现 ... -
深入浅出Win2000 (xp)计算机启动/关机脚本
2012-01-19 14:07 665深入浅出Win2000 (xp)计算 ... -
脚本病毒
2012-01-19 14:07 630脚本病毒 2011年04月30日 脚本病毒通常是Java ... -
使用脚本程序管理Windows网络(9)
2012-01-19 14:07 595使用脚本程序管理Windows ... -
开机快速自动联网(一句话的VBS)
2012-01-19 14:07 563开机快速自动联网(一句话的VBS) 2010年10月20日 ... -
使用脚本程序管理Windows网络(3)
2012-01-19 14:07 547使用脚本程序管理Windows ... -
电脑知识
2012-01-17 03:57 647电脑知识 2010年06月23日 ... -
掌握这些电脑知识,你可以玩的很无耻
2012-01-17 03:57 508掌握这些电脑知识,你可以玩的很无耻 2011年09月05日 ... -
2011-12-4
2012-01-17 03:57 5472011-12-4 2011年12月04日 ... -
第一章第一节计算机语言C语言基础教程
2012-01-17 03:57 615第一章第一节计算机语言C语言基础教程 2012年01月02日 ... -
TOAD快速入门(中文经典)
2012-01-17 03:57 650TOAD快速入门(中文经典) ... -
00000000000000000
2012-01-16 02:46 44500000000000000000 2012年01月06日 ... -
Peer-to-Peer Sockets 工程入门
2012-01-16 02:46 500Peer-to-Peer Sockets 工程入 ... -
给大学生学习ARM和FPGA的建议(转)
2012-01-16 02:45 865给大学生学习ARM和FPGA的 ... -
提高 Linux 上 socket 性能
2012-01-16 02:45 573提高 Linux 上 socket 性能 ...
相关推荐
1、系统和网络编程库:ACE 除了ACE之外,还有很多系统和网络编程方面的程序库。比如在线程库方面,还有ZThread、boost::thread,如果放大到C/C++领域,还有APR,还有CII。在文件和目录操作方面,boost也有相应的...
MD5 开源库 c++ 代码, 带测试代码 void printMD5(const string& message) { cout (\"" ) = " (message).toStr() ; } int main() { printMD5(""); printMD5("a"); printMD5("abc"); printMD5("message ...
C++开源库 -.txt
c++经典好使精简易懂易用开源日志库
开源的C++压缩库,简单实用,通俗易懂很容易上手。很多项目都在引用,压缩后可以使用各主流压缩软件进行解压。
C/C++ Base64编解码开源库,第三方开源库,亲测可用;
无需安装office,开源的Docx开发库,对word进行读写编辑等功能。
poco/c++开源库学习资料打包下载,通过网络收集整理,比较多 POCO_C++库学习和分析_--__跨平台库的生成.docx POCO_C++库学习和分析_--__随机数和数字摘要.docx POCO_C++库学习和分析_--_Cache.docx POCO_C++库学习和...
folly, 在 Facebook,一个开源 C++ 库开发并使用 : Facebook开源库什么是 folly?傻瓜( 在Facebook开放源码库之后的acronymed ) 是一个C++11组件库,设计的实用性和效率。 英镑包含了在 Facebook 广泛使用的各种核心...
SP++ (Signal Processing in C++) 是一个关于信号处理与数值计算的开源C++程序库,该库提供了信号处理与数值计算中常用算法的C++实现。
应用 使用Daisy 音频平台的嵌入式硬件 音频插件(VST、AU、JUCE) 移动应用程序(iOS、Android) VCV 机架模块 特征 合成方法:减法、物理建模、FM 过滤器:双二阶、状态变量、模态、梳状 效果处理器:混响、延迟、...
GLog是Google开发的一套日志输出框架。是一个基于程序级记录日志信息的c++库,编程使用方式与c++的stream操作类似,由于其具有功能强大、方便使用等特性,它被众多开源项目使用
libharu 写PDF 开源 C C++ 库,我已经使用VS2010编译过了,可以直接使用。也可以调试学习。
基于C++开源库OpenSceneGraph实现的图形特效编辑器。.zip基于C++开源库OpenSceneGraph实现的图形特效编辑器。.zip基于C++开源库OpenSceneGraph实现的图形特效编辑器。.zip基于C++开源库OpenSceneGraph实现的图形特效...
使用 C++ 来编写高性能的网络服务器程序,从来都不是件很容易的事情。在没有 应用任何网络框架,从 epoll/kqueue 直接码起的时候尤其如此。即便使用 libevent, libev 这样事件驱动的网络框架去构建你的服务,程序...
C++开源大数库
计算机视觉opencv开源库C++
Boost 大概是最重要的第三方 C++ 库。...它的名称源自“POrtable COmponents”,是一个基于 C++ 的开源库。 它的功能以网络通讯为主,同时也提供一些其它功能(比如:多线程、进程间通讯、数据库、XML、JSON......)
boost是一个功能强大、构造精巧、跨平台、开源并且完全免费的c++程序库,有着“c++‘准’标准库”的美誉。 本书基于boost1.42版,介绍了其中的所有99个库,并且详细深入地讲解了其中数十个库,同时实现了若干颇具...