Avro vs Protobuf Performance

时间:2018-01-20 21:25:22

标签: java serialization protocol-buffers performance-testing avro

我写了一个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;
    }

}

1 个答案:

答案 0 :(得分:0)

AVRO始终使用其架构序列化数据。

在protobuf方法中,服务器假定客户端已经知道架构,因此它只是将数据序列化为二进制格式。

对于事务性工作负载,protobuf通常更好。

AVRO通常更适合需要序列化大量记录的分析工作负载。在这种情况下,模式序列化通常可以忽略不计,而AVRO序列化则更为紧凑。