【发布时间】:2016-02-29 08:24:24
【问题描述】:
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 文档中找到,或者我自己推理,这样的加扰数字有什么好处?为什么编码后正负数交替比较好?
为什么它们不只是以小端、大端、网络顺序编写的,只需要将它们读入内存并可能反转位字节序?我们用性能买什么?
【问题讨论】:
-
如果您对类似 protobuf 且不进行昂贵的 varint 编码的东西感兴趣,请参阅 capnproto.org。它更快,但它确实需要更多的电线空间。 (披露:我是 Cap'n Proto 的作者,也是 Google 大部分开源 Protobuf 代码的作者。)
-
@KentonVarda 感谢您提供的信息,我不知道 Cap'n'proto。添加到我的协议工具带中。
-
协议缓冲区,至少从版本 2 开始,如果这对您的应用程序更有意义,让您使用固定大小的编码整数(例如 -fixed32、sfixed64 等)。例如,如果您的值将均匀分布在可能的值范围内,那么您希望使用固定形式而不是可变形式。话虽如此,常用值的聚类接近于零是很常见的,这种简单的可变长度编码可以节省大量空间。
标签: performance protocol-buffers avro zigzag-encoding