protobuf和thrift对比

本文转自:http://liuchangit.com/development/346.html


数据类型

protobufthriftprotobufthriftprotobufthriftprotobufthrift
doubledoublefloat  byte i16
int32i32int64i64uint32 uint64 
sint32 sint64 fixed32 fixed64 
sfixed32 sfixed64 boolboolstringstring
bytesbinarymessagestructenumenumserviceservice

综合对比

 protobufthrift
功能特性主要是一种序列化机制提供了全套RPC解决方案,包括序列化机制、传输层、并发处理框架等
支持语言C++/Java/PythonC++, Java, Python, Ruby, Perl, PHP, C#, Erlang, Haskell
易用性语法类似,使用方式等类似
生成代码的质量可读性都还过得去,执行效率另测
升级时版本兼容性均支持向后兼容和向前兼容
学习成本功能单一,容易学习功能丰富、学习成本高
文档&社区官方文档较为丰富,google搜索protocol buffer有2000W+结果,google group被墙不能访问官方文档较少,没有API文档,google搜索apache thrift仅40W结果,邮件列表不怎么活跃

性能对比
由于thrift功能较protobuf丰富,因此单从序列化机制上进行性能比较,按照序列化后字节数、序列化时间、反序列化时间三个指标进行,对thrift的二进制、压缩、protobuf三种格式进行对比。

测试方法:取了15000+条样本数据,分别写了三个指标的测试程序,在我自己的电脑上执行,其中时间测试循环1000次,总的序列化/反序列化次数1500W+。

平均字节数

thrift二进制535
thrift压缩473
protobuf477

序列化(1500W次)时间(ms)

thrift二进制306034
thrift压缩304256
protobuf177652

反序列化(1500W次)时间(ms)

thrift二进制287972
thrift压缩315991
protobuf157192

thrift的时间测试可能不是很准,由于thrift产生代码的复杂性,编写的测试代码为了适应其接口,在调用堆栈上可能有一些额外开销。