回复: 请教比较高效优雅的deserialize 消息处 理是怎么样的?

2 views
Skip to first unread message

流浪pig

unread,
Oct 5, 2009, 10:38:47 PM10/5/09
to dev4server
if 一个个判断不是必须的,有很多高效变通的方法,如用数组,类型作为数组下标就不用一个个比较了,直接偏移就可以。
 
 
------------------ 原始邮件 ------------------
发件人: "song huang"<huangs...@gmail.com>;
发送时间: 2009年9月29日(星期二) 晚上7:11
收件人: "dev4server"<dev4s...@googlegroups.com>;
主题: Re: 请教比较高效优雅的deserialize 消息处 理是怎么样的?
 
我可没这样说啊        
我相信无论switch case 还是指针数组  或则更高端的方法   它被解析成二进制程序的时候    依然少不了一个一个的if 匹配判断    或许底层在指令比较多的时候对key进行下排序  索引的操作


2009/9/29 qiaojie <qia...@gmail.com>
本质能说明什么问题?
所有计算机程序的本质都是二进制代码,那是不是大家都应该用二进制代码来写程序?


 
2009/9/29 benegg <ide...@163.com>
大部分的系统, 如linux-sunrpc, mangos等, 都是switch或者指针数组. 这就是本质. 我一直认为所谓的用面向对象来消息

switch/if是无中生有.

On Sep 29, 3:14 pm, sunway <sunhui...@gmail.com> wrote:
> 搞这么复杂的系统还真不如用最简单的switch case。
> 最简单的也是效率最高的,最容易维护的,代码写的再优雅,用户不认也
> 等同于垃圾。
>
> On 9月29日, 上午9时22分, Lee Alvin <alvin.gr...@gmail.com> wrote:
>
> > 他的意思估计就是把协议消息包装成多态对象,重载operator<<和operator>>,使用stream流式来序列化和反序列化。消息类型可以通过对象-类型来区分,通过多态来统一操作。








阿杜

unread,
Oct 6, 2009, 3:09:13 AM10/6/09
to dev4s...@googlegroups.com
呵呵,有点意思。用数组的方式想来还是比较好的,回头去试试。

2009/10/6 流浪pig <3706...@qq.com>

Kouga

unread,
Oct 28, 2009, 9:07:57 PM10/28/09
to dev4s...@googlegroups.com
数组是不错的,不过MAP+函数对象应该也不错的~ std::map< message_type, function > 或者 std::map< message_type, signal >。
如果为了效率,也可以用 std::vector< message_type, function > 并且需要注意空间分配,message_type太多的话需要重新resize()哦~另外没有注册的消息建议也给一个 void(){}的处理函数,避免每个消息的if判断(push和pop操作比 mov, jne稍微快点,主要是不需要在缓存未命中的时候读取外存,个人观点,欢迎拍砖)

将消息类型定义成系统常量,包含在系统配置头文件里面,处理消息(发送或者接收)的类包含该文件,并在需要的时候注册。

系统初始化启动的时候,以及运行过程中,都可以通过注册及注销消息类型来达到动态管理的目的。

消息基础定义建议只有长度+后续包标志+校验(tcp协议可以连校验都去掉),所有的消息处理函数到底层都是一个个的数据包,由底层将数据包打包成 {长度,数据}的简单封装即可。

消息处理函数可以使用信号链,这样就可以让一个消息自动广播出去,所有感兴趣的对象都能得到该消息。

系统流程看起来应该如此:
对象 -> 对象编码 -> 数据块: {message_type, 数据} -> 传输编码 -> {长度,数据块} -> 传输解码 -> {message_type, 数据}  -> 对象解码(此处可以产生消息广播)

2009/10/6 阿杜 <leaber...@gmail.com>



--
签名是什么东西??
Reply all
Reply to author
Forward
0 new messages