21

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 文档中找到,或者自己推理,这样的加扰数字有什么好处?为什么编码后交替正负数更好?

为什么它们不只是以小端、大端、网络顺序编写的,只需要将它们读入内存并可能反转位字节序?我们用性能买什么?

4

1 回答 1

21

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

这是一种编码技巧,允许写入所需的尽可能少的字节来对值进行编码。所以一个 8 字节的值在 -64 和 63 之间只需要一个字节。这很常见,long提供的范围在实践中很少使用。

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

于 2015-11-26T10:23:38.373 回答