`
cwqcwk1
  • 浏览: 86865 次
文章分类
社区版块
存档分类
最新评论

改进erlang版本的protobuf

 
阅读更多
protobuf是google开源的序列化工具,类似xml,json,基于二进制,比XML表示同样一段内容要短小得多,还可以定义一些可选字段,用于服务端与客户端通信。google没有提供对erlang语言的直接支持,所以这里使用到的第三方的protobuffs库,文章在这个库的基础上做一些改进。

在开始阅读这篇文章前,先了解一下原来erlang版的protobuf使用例子。改进版的protobuf代码及例子在这里(下载地址)。欢迎下载,有什么问题可以评论反馈。

改进protobuf

改进调用方法

原来调用比较别扭,每个协议都是不同的方法名:
encode() ->  
    Person = #person{age=25, name="John"},  
    test_pb:encode_person(Person).  
  
decode() ->  
    Data = encode(),  
    test_pb:decode_person(Data). 
现在改成了统一的方法名:
encode() ->  
    Person = #person{age=25, name="John"},  
    test_pb:encode(Person). %% 或者 test_pb:encode(person, Person)
  
decode() ->  
    Data = encode(),  
    test_pb:decode(person, Data). 
这样,很方便代码整合,只要协议映射好,封包解包就可以统一在网关层处理。

改进空协议

message tos{
}
友好兼容空结构,原来空协议会报以下的警告信息
2> test_pb:encode_tos(#tos{}).
<<>>
3> c(test_pb).
src/test_pb.erl:33: Warning: variable 'Record' is unused
{ok,test_pb}

改进调用效率

改进了序列化和反序列化的效率,encode测试效率提升10 ~ 20%, decode测试效率提升10% ~ 40%
decode优化较大,实际有些情况不止40%,取均值,部分代码优化到协议编译期,所以调用就省事多了。

总结一些效率改进的技巧

获取record名字

[RecName | _] = tuple_to_list(Data)
改成了:
erlang:element(1,Data)

函数参数匹配优化

test(Bytes) when is_binary(Bytes) ->
    ok.
改成了
test(<<Bytes/binary>>) ->
    ok.
当匹配类型多时就会明显,guard模块对于多参数或多类型匹配尤为不利,erlang在编译期不能做优化。

分割二进制

Bytes = list_to_binary("0123456789"),
split_binary(Bytes, 3),

<<B1:3/binary, B2/binary>> = Bytes,%% 测试效率没erlang:split_binary/2高
{B1, B2}.

二进制合并

11> A= <<>>.
<<>>
12> B= <<"1333">>.
<<"1333">>
15> C= <<1,3,4>>.
<<1,3,4>>
16> iolist_to_binary([B,C,A]).
<<49,51,51,51,1,3,4>>
17> <<B/binary,C/binary,A/binary>>.
<<49,51,51,51,1,3,4>>
18> c(loop).
{ok,loop}
19> loop:test().
1000000 loops, using time: 281ms
1000000 loops, using time: 94ms

case匹配优化

case Data of
   {double, C} -> ok;
   {float, C} -> ok;
   {int, C} -> ok;
   {string, C} -> ok;
   _ -> ok
end

case Data of
   {C, double} -> ok;
   {C, float} -> ok;
   {C, int} -> ok;
   {C, string} -> ok;
   _ -> ok
end
第一种匹配效率较高,case匹配类似函数参数匹配,固定不变的内容放匹配表达式左边

比较erlang原生的二进制转换

最后,比较 erlang:term_to_binary/1 与 erlang:binary_to_term/1 的效率
测试结果发现erlang原生的二进制转换的效率超高,但是数据没压缩,不适合直接使用。实际使用需要配合 zlib:zip/1,这个是压缩工具,可能还需要稍微优化一下
zip(Data) ->
  Z = zlib:open(),
  Bs =
  try
      zlib:deflateInit(Z, best_speed, deflated, -15, 1, default),
      B = zlib:deflate(Z, Data, finish),
      zlib:deflateEnd(Z),
      B
  after
      zlib:close(Z)
  end,
  iolist_to_binary(Bs).
测试结果:
erlang:term_to_binary/1(配合zlib:zip/1)时间开销比 protobuf 多15%。
erlang:binary_to_term/1(配合zlib:unzip/1)时间开销差不多是 protobuf 的50%。


2015/6/11 修复字段默认值没有生效bug
2015/6/11 修复proto文件换行无法编译bug
分享到:
评论

相关推荐

    erlang版本的protobuf(erl_protobuffs)

    **protobuf与Erlang** `protobuf`,全称Protocol Buffers,是Google开发的一种数据序列化协议,类似于XML和JSON,但更小巧、快速且高效。它允许开发者定义数据结构,然后生成相应的代码来轻松地读写这些数据,支持...

    在erlang项目中使用protobuf例子

    标题中的“在erlang项目中使用protobuf例子”指的是在Erlang编程环境中使用Protocol Buffers(protobuf)这一数据序列化工具。protobuf是由Google开发的一种高效、跨语言的数据表示和序列化格式,它允许开发者定义...

    改进erlang版的protobuf代码

    在描述中提到的“效率有很大提升”,暗示了这个改进版本可能包括以下方面: 1. **解析速度优化**:原生protobuf在Erlang中的解析速度可能较慢,改进可能涉及更高效的解码算法或利用Erlang的二进制操作特性来加速...

    最新最全rabbitmq与erlang版本匹配-2020-04-23.docx

    **RabbitMQ与Erlang版本匹配指南** RabbitMQ是一种广泛使用的开源消息代理和队列服务器,它基于Erlang编程语言构建。Erlang以其并发能力、容错性和分布式特性而闻名,是实现RabbitMQ的理想选择。正确地匹配RabbitMQ...

    erlang_版本24.3.4.4

    版本24.3.4.4是Erlang的一个更新版本,包含了对先前版本的改进和修复。Erlang以其强大的错误恢复能力和轻量级进程(称为Erlang进程)而闻名,这些进程具有内置的并发性和容错性。 在安装Erlang 24.3.4.4之前,首先...

    最新最全rabbitmq与erlang版本匹配-2020-04-23.ods

    最新最全rabbitmq与erlang版本匹配-2020-04-23

    Erlang的windows版本

    Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的...

    linux下erlang22版本和rabbitmq3.7版本

    Erlang 22版本引入了一些关键改进,包括: 1. **性能提升**:Erlang 22对VM(虚拟机)进行了优化,提高了运行时性能,使得处理大量并发连接和数据交换更加高效。 2. **错误处理**:增强了错误报告和调试工具,使得...

    erlang25.0 windows版本

    5. **并发与分布式特性**:Erlang以其强大的并发处理能力著称,新版本可能在进程管理、消息传递等方面有进一步的改进。 6. **编译器升级**:Erlang的BEAM虚拟机和编译器可能会有优化,使得编译速度更快,生成的代码...

    RabbitMQ3.9.13和ErLang24.2版本

    5. **语言和库更新**:Erlang的新版本通常会包含语言特性的增强和库的更新,这些改进可能会间接影响到RabbitMQ的性能和功能。 在安装这两个软件时,首先需要下载Erlang的erlang_24.2.exe文件,安装后才能运行...

    erlang_protobuffs

    Erlang Protobuffs是一个用于Erlang的协议缓冲区(Protocol Buffers)实现,它允许Erlang程序与使用Google Protobuf编译器生成的消息格式进行交互。Google Protobuf是一种高效的数据序列化协议,广泛应用于跨语言的...

    erlang 24.0版本 win64 位

    在Erlang 24.0版本中,开发者可以期待一系列的改进和新特性。首先,性能提升是每个新版本的重点。Erlang 24.0可能包含对虚拟机(BEAM)的优化,使得代码执行速度更快,内存管理更高效。这直接影响到运行Erlang应用...

    rabbitmq3.7.14的安装包以及erlang对应版本

    在IT领域,消息队列(Message Queue)是分布式系统中重要的中间件,它允许应用程序异步处理任务,提高系统的响应速度和可扩展性。...记得定期更新RabbitMQ和Erlang到最新稳定版本,以获取最新的特性和安全修复。

    rabbitmq + Erlang

    确保选择的Erlang版本与你要安装的RabbitMQ版本相匹配,否则可能会导致RabbitMQ无法正常运行。 **RabbitMQ与Erlang版本对应** RabbitMQ的每个版本都有其对应的Erlang最小版本要求。例如,RabbitMQ 3.9版本可能需要...

    erlang-protobuffs

    听说google proto buffer(以下简称protobuf)已经很久了,但是一直没有尝试使用它。其中一个原因是,项目组自己写了个打包和解包的工具,而且代码也简单,可以很方便的扩展到自动生成xml之类的配置文件,已经能很好...

    erlang-23.2.1-1.el7.x86-64.rpm

    确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 ...

    适用于windows版本的 Erlang24 and RabbitMQ server 3.8.16下载

    RabbitMQ的3.8.16版本是一个成熟的发布,提供了许多改进和修复,确保了可靠性和性能。此版本可能包含了一些新的特性和安全更新,以增强消息传递的稳定性和安全性。在Java环境中,RabbitMQ可以通过Java API(如...

    erlang23.2版本rpm包

    erlang23.2版本rpm包

    esl-erlang_23.0_windows_amd64.exe rabbitmq-server-3.8.4.exe

    esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装就行,可以直接下载就可安装,非常的方便 ,欢迎大家下载 注意事项: 1. Erlang版本和RabbitMQ版本要配套 (Erlang23.0, RabbitMQ3.8.4) 2. amd芯片请乖乖...

    rabbitmq-server-3.8.3.exe和erlang22.2.exe 64位压缩文件

    RabbitMQ每个新版本的发布都会带来一些改进,以提高服务的稳定性和效率。 描述中提到的"erlang22.2.exe"则是Erlang OTP(Open Telephony Platform)的22.2版本,同样为64位。OTP是Erlang的开发框架,包含了大量...

Global site tag (gtag.js) - Google Analytics