ZigZag需要大量的开销来编写/读取数字。实际上,我惊讶地发现,它不只是写整数/长值,而是做了许多额外的扰码。甚至还有一个循环:https://github.com/mardambey/mypipe/blob/master/avro/lang/java/avro/src/main/java/org/apache/avro/io/DirectBinaryEncoder.java#L90
我似乎在协议缓冲器文档或Avro文档中找不到,或者我自己也找不到,这样加扰数字有什么好处?为什么编码后将正数和负数交替比较好呢?
为什么它们不只是用小终端、大端、网络顺序写成,只需要将它们读入内存,并可能逆转比特的盲目性呢?我们用性能来买什么?
发布于 2015-11-26 10:23:38
它是一个可变长度的7位编码.编码值的第一个字节设置为0,随后的字节设置为1。这是译码器用来编码该值的字节数。无论机器架构如何,字节顺序总是很少的。
这是一种编码技巧,允许根据需要编写尽可能少的字节来对值进行编码。因此,一个8字节长的值在-64到63之间,只需要一个字节。这是很常见的,在实践中很少使用long提供的范围。
在没有gzip风格的压缩方法开销的情况下,将数据紧密打包是设计目标。也用于.NET Framework。对该值进行编码/解码所需的处理器开销是不重要的。它已经比压缩方案低得多,是I/O成本的非常小的一部分。
https://stackoverflow.com/questions/33935266
复制相似问题