JSON

Protobuf ,Thrift , MessagePack , JSON序列化的性能对比

字号+ 作者:H5之家 来源:H5之家 2017-10-23 17:17 我要评论( )

转的,没地址 测试的环境是RMBP 15寸,8G内存,2.3GHz主频i7,Protobuf版本为2.5,Thrift版本为0.9.0,MessagePack版本为0.3,使用的都是带C模块的Python库。先

转的,没地址

测试的环境是RMBP 15寸,8G内存,2.3GHz主频i7,Protobuf版本为2.5,Thrift版本为0.9.0,MessagePack版本为0.3,使用的都是带C模块的Python库。先简单看看数据结构:

message UserMsg { required int32 service = 1; required int32 command = 2; required string name = 3; required string signature = 4; required int32 age = 5; optional string info = 6; }



做了几组10万/50万/100百的记录测试,100万条记录的测试结果如下:

== load data done, size:1000000 == Stat for cpickle, 1000000 total Serialize : 201200 obj/sec, total=4.970 sec Deserialize : 288104 obj/sec, total=3.471 sec Total bytes : 252937.411KB Stat for json, 1000000 total Serialize : 114889 obj/sec, total=8.704 sec Deserialize : 98159 obj/sec, total=10.188 sec Total bytes : 251814.047KB Stat for msgpack, 1000000 total Serialize : 310994 obj/sec, total=3.215 sec Deserialize : 1067383 obj/sec, total=0.937 sec Total bytes : 221695.558KB Stat for protobuf, 1000000 total Serialize : 49482 obj/sec, total=20.210 sec Deserialize : 119699 obj/sec, total=8.354 sec Total bytes : 183601.896KB Stat for compact thrift, 1000000 total Serialize : 16184 obj/sec, total=61.790 sec Deserialize : 16627 obj/sec, total=60.143 sec Total bytes : 185066.761KB Stat for bin thrift, 1000000 total Serialize : 26125 obj/sec, total=38.277 sec Deserialize : 20175 obj/sec, total=49.567 sec Total bytes : 212890.625KB






从安装这几个库到做了这几组测试对比,简单总结下测试结果:

安装的复杂度: Thrift >> Protobuf > BSON > MessagePack > JSON,BSON本来是加入到测试里面的,BSON的安装也不复杂,但是BSON的数据类型与MongoDB关联太紧密,让我觉得其脱离MongoDB的可用广泛性不高,而且安装C模块的时候,已经看到了目录下有cbson.so,但调用bson.has_c()的时候仍然返回False。基于这几个原因,我就没有将BSON加入到测试范围里面。

序列化后的数据大小: JSON > MessagePack > Binary Thrift > Compact Thrift > Protobuf。

序列化和反序列化耗费的时间: Compact Thrift > Binary Thrift > Protobuf > JSON > MessagePack。

从上面的结果来看,数据最小的是Protobuf,比JSON占用小了25%左右的空间,速度最快的是MessagePack,比JSON快3倍,从Protobuf快8倍的时间。

MessagePack的测试结果,序列化后的数据比JSON小,而且解析速度也比JSON快,序列化后的数据也会比BSON小一点,因为BSON比MessagePack多用了’0’来结束一个字符串。MessagePack支持的语言非常多。而且在redis里面也整合了一个MessagePack的C解析模块,redis的作者似乎对MessagePack的评价也比较高。上面的cPickle用的是二进制协议的,MessagePack有点丧心病狂,比cPickle还快。

Probobuf只支持Java, C++和Python,虽然语言不多,但是基本上已经包括了大部分的应用了,当然第三方支持的语言也相当多,加上文档相当齐全,随便google一下就能找到相关的例子,安装起来也不算特别复杂。使用C模块的话启用PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp这个环境变量就可以了。

Thrift的测试结果让我有点失望,和网上其他的测试对比起来速度和数据大小上都有比较大的差距,我使用的是0.9.0版本,用gcc-4.9安装的,安装过程也让我相当费劲,0.9.1版本发布不够1个月,make不成功的提示google不出什么解决方案,加上在OS X上安装的人也似乎很少,最后回退到0.9.0版本,出现不一样的提示后来才意识是gcc版本过低,升到gcc-4.9就安装成功了,thrift这个依赖库也太繁琐了,而且相关文档也甚少。

实际使用哪种通用协议取决于实际的需求的,速度要求比较高的就使用MessagePack和JSON,对数据要求比较小的就使用Protobuf和MessagePack了,语言支持数量现在也应该不会有问题,支持的第三方库也不少,当然效率还是需要测试再作对比。至于Thrift,我再抽时间在线上的服务器再做一次对比。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • php MessagePack介绍[PHP教程]

    php MessagePack介绍[PHP教程]

    2017-04-04 08:01

  • Convert an object to a JSON string with thrift json serializ

    Convert an object to a JSON string with thrift json serializ

    2017-02-06 14:00

  • 数据交换利器 Protobuf 技术浅析

    数据交换利器 Protobuf 技术浅析

    2016-11-05 18:04

网友点评
y