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,网络顺序编写,只需要将它们读入内存并可能反转位字节序?我们购买什么以性能付款?
答案 0 :(得分:10)
它是一个可变长度的7位编码。编码值的第一个字节将高位设置为0,后续字节将其设置为1.这是解码器可以判断使用了多少字节来编码值的方式。无论机器架构如何,字节顺序总是小端的。
这是一种编码技巧,允许根据需要编写少量字节来编码值。因此,一个8字节的长,其值介于-64和63之间,只需一个字节。这很常见, long 提供的范围在实践中很少使用。
在没有gzip风格压缩方法开销的情况下紧密打包数据是设计目标。也用于.NET Framework。进行/解码该值所需的处理器开销是无关紧要的。已经远低于压缩方案,它只占I / O成本的一小部分。