protobuf,thrift,avro之序列化性能测试

时间:2022-10-15 07:56:38

简要记述一下在c++环境下protobuf、thrift与avro序列化性能结果。

测试方法:分别用三种协议定义一个包含同样字段的数据结构,然后重复调用多次,比较三者之间花费的时间。具体定义的数据结构为:

[cpp]  view plain  copy   protobuf,thrift,avro之序列化性能测试 protobuf,thrift,avro之序列化性能测试
  1. Person {  
  2.   int id;  
  3.   string name;  
  4.   string email;  
  5. }  

测试环境:一台两年前购置的Mac电脑(具体配置有待补充)。

测试结果:迭代次数分别为:1、10000、100000(thrift使用了两种编码方式:binary和compact)

[plain]  view plain  copy   protobuf,thrift,avro之序列化性能测试 protobuf,thrift,avro之序列化性能测试
  1. [avro encode] times: 1, milli: 0.046078  
  2. [avro decode] times: 1, milli: 0.030119  
  3. [avro encode] times: 10000, milli: 21.9206  
  4. [avro decode] times: 10000, milli: 15.3672  
  5. [protobuf encode] times: 1, milli: 0.023208  
  6. [protobuf decode] times: 1, milli: 0.007489  
  7. [protobuf encode] times: 10000, milli: 12.4098  
  8. [protobuf decode] times: 10000, milli: 8.18684  
  9. [thrift binary encode] times: 1, milli: 0.042721  
  10. [thrift binary decode] times: 1, milli: 0.012054  
  11. [thrift binary encode] times: 10000, milli: 22.8659  
  12. [thrift binary decode] times: 10000, milli: 25.6858  
  13. [thrift compact encode] times: 1, milli: 0.055757  
  14. [thrift compact decode] times: 1, milli: 0.02131  
  15. [thrift compact encode] times: 10000, milli: 29.9698  
  16. [thrift compact decode] times: 10000, milli: 38.1937  
  17. [avro encode] times: 1, milli: 0.038088  
  18. [avro decode] times: 1, milli: 0.021185  
  19. [avro encode] times: 100000, milli: 219.917  
  20. [avro decode] times: 100000, milli: 167.694  
  21. [protobuf encode] times: 1, milli: 0.04218  
  22. [protobuf decode] times: 1, milli: 0.01303  
  23. [protobuf encode] times: 100000, milli: 98.2691  
  24. [protobuf decode] times: 100000, milli: 74.7578  
  25. [thrift binary encode] times: 1, milli: 0.046932  
  26. [thrift binary decode] times: 1, milli: 0.015221  
  27. [thrift binary encode] times: 100000, milli: 232.316  
  28. [thrift binary decode] times: 100000, milli: 266.397  
  29. [thrift compact encode] times: 1, milli: 0.034175  
  30. [thrift compact decode] times: 1, milli: 0.013485  
  31. [thrift compact encode] times: 100000, milli: 307.872  
  32. [thrift compact decode] times: 100000, milli: 381.324  

从以上结果可以看出:protobuf表现优异,avro次之,thrift表现总体较差(binary比compact好些)。

结束语:以上结果仅供参考,实际选用要结合项目的具体情况。如需要性能绝对优先,那就应该选择protobuf;否则需要支持多种开发语言则应该选择thrift;avro的动态特性似乎也颇具吸引力。