在Protocol Buffers和Avro中ZigZag编码背后的原因是什么?

时间:2015-11-26 09:46:43

标签: performance protocol-buffers avro zigzag-encoding

ZigZag需要大量的开销才能写入/读取数字。实际上,我惊讶地发现它并不像它们那样只是写入int / long值,而是会进行大量额外的加扰。甚至涉及到一个循环: https://github.com/mardambey/mypipe/blob/master/avro/lang/java/avro/src/main/java/org/apache/avro/io/DirectBinaryEncoder.java#L90

我似乎无法在Protocol Buffers文档或Avro文档中找到,或者自我推理,那些像这样扰乱数字的优势是什么?为什么在编码后交替使用正数和负数会更好?

为什么他们不只是用little-endian,big-endian,网络顺序编写,只需要将它们读入内存并可能反转位字节序?我们购买什么以性能付款?

1 个答案:

答案 0 :(得分:10)

它是一个可变长度的7位编码。编码值的第一个字节将高位设置为0,后续字节将其设置为1.这是解码器可以判断使用了多少字节来编码值的方式。无论机器架构如何,字节顺序总是小端的。

这是一种编码技巧,允许根据需要编写少量字节来编码值。因此,一个8字节的,其值介于-64和63之间,只需一个字节。这很常见, long 提供的范围在实践中很少使用。

在没有gzip风格压缩方法开销的情况下紧密打包数据是设计目标。也用于.NET Framework。进行/解码该值所需的处理器开销是无关紧要的。已经远低于压缩方案,它只占I / O成本的一小部分。