繁体   English   中英

反序列化 avro 很慢

[英]Deserializing avro is slow

我尝试使用 Java 在几种序列化格式(包括 avro/protobuf/thrift 等)之间进行性能测试。

测试基于反序列化具有 30 个长类型字段的字节数组消息 1,000,000 次。 avro 的结果并不好。

protobuf/thrift 平均使用大约 2000 毫秒,但 avro 需要 9000 毫秒。

在文档中建议重用解码器,所以我按如下方式执行代码。

byte[] bytes = readFromFile("market.avro");
long begin = System.nanoTime();
DatumReader<Market> userDatumReader = new ReflectDatumReader<>(Market.class);
InputStream inputStream = new SeekableByteArrayInput(bytes);
BinaryDecoder reuse = DecoderFactory.get().binaryDecoder(inputStream, null);
Market marketReuse = new Market();
for (int i = 0; i < loopCount; i++) {
    inputStream = new SeekableByteArrayInput(bytes);
    BinaryDecoder decoder = DecoderFactory.get().binaryDecoder(inputStream, reuse);
    userDatumReader.read(marketReuse, decoder);
}

long end = System.nanoTime() - begin;
System.out.println("avro loop " + loopCount + " times: " + (end * 1d / 1000 / 1000));

我认为 avro 不应该那么慢,所以我相信我做错了什么,但我不确定有什么意义。 我是否以错误的方式进行“重用”?

对 avro 性能测试有什么建议吗? 提前致谢。

我花了一段时间才弄清楚这个。 但显然

DecoderFactory.get().binaryDecoder是罪魁祸首——每次调用它都会创建一个 8KB 的缓冲区。 并且此缓冲区不会重复使用,而是在每次调用时重新分配。 我看不出有任何理由首先涉及缓冲区。

更明智的选择是使用DecoderFactory.get().directBinaryDecoder

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM