我写了一个JMH基准来比较Avro(1.8.2)和&的序列化性能。 java 1.8中的Protobuf(3.5.0)。根据JMH的说法,Protobuf可以在一秒钟内将一些数据序列化470万次,而Avro每秒只能达到800k。
序列化的测试数据大约是200字节,我为Avro和Protobuf生成了模式。
这是我的Avro序列化代码,熟悉Avro的人可以确保我没有犯过一些重大错误吗?
名为serialize的方法是JMH基准测试的方法。另外,我已在https://groups.google.com/forum/#!topic/protobuf/skmE78F-XbE
发布此内容非常感谢
public final class AvroSerialization{
private BinartEncoder encoder;
private final SpecificDatumWriter writer;
public AvroSerialization( ){
this.writer = new SpecificDatumWriter( AvroGeneratedClass.class );
}
//MyDataObject = A pojo that contains the data to be serialized
public final byte[] serialize( MyDataObject data ){
ByteArrayOutputStream out = new ByteArrayOutputStream( 1024 );
encoder = EncoderFactory.get().binaryEncoder( out, encoder );
AvroGeneratedClass avroData = createAvro( data );
writer.write( avroData, encoder );
encoder.flush();
return out.toByteArray();
}
//AvroGeneratedClass = Class generated by the Avro Schema
public final static AvroGeneratedClass createAvro( MyDataObject data ){
AvroGeneratedClass avroData = AvroGeneratedClass.newBuilder()
.setXXX( data.getXXX )
.setXXX( data.getXXX )
...
return avroData;
}
}
答案 0 :(得分:0)
AVRO始终使用其架构序列化数据。
在protobuf方法中,服务器假定客户端已经知道架构,因此它只是将数据序列化为二进制格式。
对于事务性工作负载,protobuf通常更好。
AVRO通常更适合需要序列化大量记录的分析工作负载。在这种情况下,模式序列化通常可以忽略不计,而AVRO序列化则更为紧凑。