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