转的,没地址
测试的环境是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,我再抽时间在线上的服务器再做一次对比。