0x1 摘要
平時開發中經常聽到序列與反序列化,特别是在分布式系統與RPC應用中,今天突然心血來潮對幾種常用的序列化架構做個性能測試對比,測試對象:
- Java 原生序列
- Avro
- Thrift
- Protobuf
0x2 測試環境及工具
測試環境:
系統類型:64 位作業系統
CPU:Intel(R) Core(TM) i3-4130 CPU @ 3.40 GHz 3.40 GHz
記憶體:8 GB
開發工具:IDEA
測試工具:
JMH
0x3 測試實體
public class User implements Serializable{
private static final long serialVersionUID = 5149128310592716591L;
private int age;
private String username;
private String address;
public int getAge() {
return age;
}
public User setAge(int age) {
this.age = age;
return this;
}
public String getUsername() {
return username;
}
public User setUsername(String username) {
this.username = username;
return this;
}
public String getAddress() {
return address;
}
public User setAddress(String address) {
this.address = address;
return this;
}
}
0x4 JMH參數設定
@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 3)
@Measurement(iterations = 10, time = 5, timeUnit = TimeUnit.SECONDS)
@Threads(4)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
參數意義不在此文做介紹,大家可以自行網上搜尋或者看官網。
0x5 測試結果
Encode:
Benchmark | Mode | Cnt | Score | Erorr | Units |
---|---|---|---|---|---|
SerializableEncodeTest.testAvroSerializableEncode | thrpt | 20 | 2881.398 ± | 27.619 | ops/ms |
SerializableEncodeTest.testJavaSerializableEncode | 1708.157 ± | 122.516 | |||
SerializableEncodeTest.testProtobufSerializableEncode | 10349.962 ± | 215.994 | |||
SerializableEncodeTest.testThriftSerializableEncode | 5292.191 ± | 49.890 |
Decode:
931.167 ± | 13.185 | ||||
521.145 ± | 6.993 | ||||
25335.295 ± | 564.496 | ||||
5239.726 ± | 75.048 |
0x6 結論
從結果中不難看出,
Protobuf
不管是序列化還是反序列化都有絕對優勢,
Java原生
都是最弱的。