簡體   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