ACE/asio/libevent/apr

142 views
Skip to first unread message

rockeet

unread,
Jan 4, 2009, 10:00:16 AM1/4/09
to TopLanguage
整体感觉:ACE太庞大,asio 太赶时髦;libevent和apr都是纯C的,不过libevent太小,apr还行。

ACE太过庞大,使得你即便是只使用它的一小部分,也不得不引用它的全部。而且框架一大堆,模式一个加一个,很多编程习惯也要改变。学习曲线太陡,也难
以将它作为一个模块集成自己的应用。

asio呢,有个牛大大说它是现时代的ACE,我觉得比较中肯。它太赶时髦了,过度模板化,用bind做回调也并不比虚函数好,看上去灵活了,代价却更
高了。我说的不光是运行时的内存和时间代价,更重要的编译时间难以忍受。

apr大约只是一个平台无关的api封装,相对来说比较轻量级。如果有C++的封装就更好了。

libevent就更轻量级了,轻量级到无法把它当成一个平台无关的socket库,仍然写很多平台相关的代码。

相比而下,我觉得apr还好点,其实我需要的只是一个机制,而不是一个完整的策略,这是unix的哲学。如果仅就异步通讯来说,我觉得
linux.epoll是最好的,简单、直接、有效,如果在每个平台上都有epoll可用,所有其它封装在我看来都是多余的了。

proactor真的就比reactor高效吗?它更多的是一种策略,据说Windows的操作系统级IOCP是用线程池实现的,它能高效到哪里
去?

陨落雕

unread,
Jan 4, 2009, 11:09:00 AM1/4/09
to TopLanguage
用apr封装一个libevent就好了。不过现在apr也封装太多东西了,看apr-util里面一堆。

bobo

unread,
Jan 4, 2009, 9:16:39 PM1/4/09
to TopLanguage

我挺喜欢libev和libevent这种轻量级的东东的。 上次在看到一个人有把iocp封装进libevent的。。
这里:
http://www.javaeye.com/topic/199143

rockeet

unread,
Jan 4, 2009, 10:51:57 PM1/4/09
to TopLanguage
如果libevent再有socket创建,系统初始化(WSAStartup等),名字解析等功能,就完美了,即使没有C++封装

headline

unread,
Jan 6, 2009, 11:48:36 PM1/6/09
to TopLanguage
ms还有个和libevent类似的叫libhttpd的。

李扬

unread,
Jan 7, 2009, 1:00:48 AM1/7/09
to pon...@googlegroups.com
proactor是类似于协程的东西。如果你要处理的是成百上千的socket,那还是IOCP要高效得多哦。

2009/1/4 rockeet <roc...@gmail.com>

BBP

unread,
Jan 7, 2009, 2:41:34 AM1/7/09
to TopLanguage
ACE是太庞大了,而且侵入式编程,用起来比较麻烦。之前用它写过一个多连接的客户端,后来改用asio重写了一遍。

asio我一直在用,写法是和ACE差不多,但因为是非侵入式,实际上要比ACE好用的多。bind回调是很灵活,但是代价更高却不见得,
template这种东西把很多运行期的东东都在编译期优化了,况且也没有数据说明有性能问题。想必你也不会所有地方都包含asio,所以编译时间也不
应该成为问题(如果有问题我觉得是你使用上的问题)。

以上两个已经是框架级的库了,不应该和其他比较偏底层的库一起比较。

On 1月4日, 下午11时00分, rockeet <rock...@gmail.com> wrote:

pvoid

unread,
Jan 7, 2009, 9:04:19 AM1/7/09
to TopLanguage
asio的性能问题可能主要是内部需要用到很多小对象,而且实际使用的时候可能还会用到智能指针之类的东西,也会影响到效率。不过asio现在已经比较
稳定,未来的改进方向之一应该是提高性能,优化内存占用
至于ACE,我觉得它的设计目标订得太高,架子铺的太大,复杂度也过高;而且代码实现也不太好,不如asio
asio的性能虽然不是最高,但功能完善,使用也比较简单,不需要付出太多的努力就可以获得很不错的性能,对于大部分应用来说已经是很好了

jinhu wang

unread,
Jan 7, 2009, 11:20:36 PM1/7/09
to pon...@googlegroups.com
没人用poco么

2009/1/7 pvoid <fredc...@gmail.com>:

BBP

unread,
Jan 9, 2009, 7:30:19 AM1/9/09
to TopLanguage
解决小对象问题直接把分配器换成boost::pool_allocator就行了

Duzy Chan

unread,
Jan 21, 2009, 8:06:55 AM1/21/09
to pon...@googlegroups.com
BBP 的说法比较赞同。

bronco

unread,
Feb 1, 2009, 3:11:46 AM2/1/09
to pon...@googlegroups.com
顶 BBP 的说法

2009/1/21 Duzy Chan <du...@duzy.info>

bronco

unread,
Feb 1, 2009, 3:16:34 AM2/1/09
to pon...@googlegroups.com
用了大半年libevent,之间出现过最搞笑的一件事是:

event_set(struct event*, ...); //这个指针必须是堆上滴,而他的sample是栈上滴,害过一大批人;

asio,用起来真TMD舒服;



2009/2/1 bronco <renfe...@gmail.com>

宇文拓

unread,
Feb 2, 2009, 12:03:30 AM2/2/09
to TopLanguage
不知有人用ICE吗

On 2月1日, 下午4时16分, bronco <renfengx...@gmail.com> wrote:
> 用了大半年libevent,之间出现过最搞笑的一件事是:
>
> event_set(struct event*, ...); //这个指针必须是堆上滴,而他的sample是栈上滴,害过一大批人;
>
> asio,用起来真TMD舒服;
>

> 2009/2/1 bronco <renfengx...@gmail.com>
>
> > 顶 BBP 的说法
>
> > 2009/1/21 Duzy Chan <d...@duzy.info>


>
> > BBP 的说法比较赞同。
> >> --
> >>http://duzy.info
>

> >> 2009/1/7 BBP <zzffb...@gmail.com>

何源

unread,
Feb 2, 2009, 8:37:29 AM2/2/09
to TopLanguage

On 2月2日, 下午1时03分, 宇文拓 <zlwil...@gmail.com> wrote:
> 不知有人用ICE吗

有啊,有啊。我们在几个项目中都用了Ice.
不过Ice和ACE这些不是一马事啊。

宇文拓

unread,
Feb 2, 2009, 10:00:17 AM2/2/09
to TopLanguage
嗯,只是提一下,这个更偏应用点。。。
我一个朋友有次想要个win32/linux跨平台的小网络层(不想要ace那种大块头),结果找来找去,最后就用这个了,像这种情况,有啥更好的推荐

张沈鹏

unread,
Feb 2, 2009, 10:57:42 AM2/2/09
to pon...@googlegroups.com
pyro 配合 python 做远程调用满方便

2009/2/2 宇文拓 <zlwi...@gmail.com>:

avalon

unread,
Feb 3, 2009, 12:32:59 AM2/3/09
to pon...@googlegroups.com
ICE是RPC利器,把它当作单纯的网络库,是大材小用了。
我尝试过asio,ace,ice,raknet...最终决定还是自己写了一个。
网络编程其实是很简单的,应该搞得越简单越好。

宇文拓 写道:

rockeet

unread,
Feb 3, 2009, 12:40:57 AM2/3/09
to TopLanguage
自己写一个,的确不难,但很麻烦,在不同的平台下,要为相同的功能写很多不同的代码,而且你往往不太可能有机会在每个平台下都进行充分测试

> >> 不过Ice和ACE这些不是一马事啊。- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Lai Jiangshan

unread,
Feb 5, 2009, 7:09:54 AM2/5/09
to pon...@googlegroups.com
我路过了一个跟我完全无关的话题, 我也没用过这些工具

2009/2/1 bronco <renfe...@gmail.com>:


> 用了大半年libevent,之间出现过最搞笑的一件事是:
>
> event_set(struct event*, ...); //这个指针必须是堆上滴,而他的sample是栈上滴,害过一大批人;

我觉得你的论调怪怪的, 栈的又怎样? 堆的有怎样? 他们都是一样的,
调用者专递一个指针过去, 调用者就必须保证这个指针的内存生命周期是符合调用函数的.

事实上, 我用内存这么久, 从来不觉得栈和堆有本质的区别.

(可能例子没保证生命周期, 所以误导人 我的臆想)

Reply all
Reply to author
Forward
0 new messages