簡要記述一下在c++環境下protobuf、thrift與avro序列化性能結果。
測試方法:分別用三種協議定義一個包含同樣字段的數據結構,然後重複調用多次,比較三者之間花費的時間。具體定義的數據結構爲:
Person {
int id;
string name;
string email;
}
測試環境:一臺兩年前購置的Mac電腦(具體配置有待補充)。
測試結果:迭代次數分別爲:1、10000、100000(thrift使用了兩種編碼方式:binary和compact)
[avro encode] times: 1, milli: 0.046078
[avro decode] times: 1, milli: 0.030119
[avro encode] times: 10000, milli: 21.9206
[avro decode] times: 10000, milli: 15.3672
[protobuf encode] times: 1, milli: 0.023208
[protobuf decode] times: 1, milli: 0.007489
[protobuf encode] times: 10000, milli: 12.4098
[protobuf decode] times: 10000, milli: 8.18684
[thrift binary encode] times: 1, milli: 0.042721
[thrift binary decode] times: 1, milli: 0.012054
[thrift binary encode] times: 10000, milli: 22.8659
[thrift binary decode] times: 10000, milli: 25.6858
[thrift compact encode] times: 1, milli: 0.055757
[thrift compact decode] times: 1, milli: 0.02131
[thrift compact encode] times: 10000, milli: 29.9698
[thrift compact decode] times: 10000, milli: 38.1937
[avro encode] times: 1, milli: 0.038088
[avro decode] times: 1, milli: 0.021185
[avro encode] times: 100000, milli: 219.917
[avro decode] times: 100000, milli: 167.694
[protobuf encode] times: 1, milli: 0.04218
[protobuf decode] times: 1, milli: 0.01303
[protobuf encode] times: 100000, milli: 98.2691
[protobuf decode] times: 100000, milli: 74.7578
[thrift binary encode] times: 1, milli: 0.046932
[thrift binary decode] times: 1, milli: 0.015221
[thrift binary encode] times: 100000, milli: 232.316
[thrift binary decode] times: 100000, milli: 266.397
[thrift compact encode] times: 1, milli: 0.034175
[thrift compact decode] times: 1, milli: 0.013485
[thrift compact encode] times: 100000, milli: 307.872
[thrift compact decode] times: 100000, milli: 381.324
從以上結果可以看出:protobuf表現優異,avro次之,thrift表現總體較差(binary比compact好些)。
結束語:以上結果僅供參考,實際選用要結合項目的具體情況。如需要性能絕對優先,那就應該選擇protobuf;否則需要支持多種開發語言則應該選擇thrift;avro的動態特性似乎也頗具吸引力。