protobuf是google开源的序列化工具,类似xml,json,基于二进制,比XML表示同样一段内容要短小得多,还可以定义一些可选字段,用于服务端与客户端通信。google没有提供对erlang语言的直接支持,所以这里使用到的第三方的protobuffs库,文章在这个库的基础上做一些改进。
在开始阅读这篇文章前,先了解一下原来erlang版的protobuf使用例子。改进版的protobuf代码及例子在这里(下载地址)。欢迎下载,有什么问题可以评论反馈。
改进protobuf
改进调用方法
原来调用比较别扭,每个协议都是不同的方法名:
现在改成了统一的方法名:
这样,很方便代码整合,
只要协议映射好,封包解包就可以统一在网关层处理。
改进空协议
友好兼容空结构,原来空协议会报以下的警告信息
改进调用效率
改进了序列化和反序列化的效率,encode测试效率提升10 ~ 20%, decode测试效率提升10% ~ 40%
decode优化较大,实际有些情况不止40%,取均值,部分代码优化到协议编译期,所以调用就省事多了。
decode优化较大,实际有些情况不止40%,取均值,部分代码优化到协议编译期,所以调用就省事多了。
获取record名字
函数参数匹配优化
当匹配类型多时就会明显,guard模块对于多参数或多类型匹配尤为不利,erlang在编译期不能做优化。
分割二进制
二进制合并
case匹配优化
第一种
匹配
效率较高,case匹配类似函数参数匹配,固定不变的内容放匹配表达式左边
比较erlang原生的二进制转换
最后,比较 erlang:term_to_binary/1 与 erlang:binary_to_term/1 的效率测试结果发现erlang原生的二进制转换的效率超高,但是数据没压缩,不适合直接使用。实际使用需要配合 zlib:zip/1,这个是压缩工具,可能还需要稍微优化一下
测试结果:
erlang:term_to_binary/1(配合zlib:zip/1)时间开销比 protobuf 多15%。
erlang:binary_to_term/1(配合zlib:unzip/1)时间开销差不多是 protobuf 的50%。
作者:【没有开花的树】
出处:http://blog.youkuaiyun.com/mycwq/article/details/42060641
出处:http://blog.youkuaiyun.com/mycwq/article/details/42060641
1409

被折叠的 条评论
为什么被折叠?



