首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >协议缓冲区和Avro中的ZigZag编码背后的原因是什么?

协议缓冲区和Avro中的ZigZag编码背后的原因是什么?
EN

Stack Overflow用户
提问于 2015-11-26 09:46:43
回答 1查看 6.3K关注 0票数 21

ZigZag需要大量的开销来编写/读取数字。实际上,我惊讶地发现,它不只是写整数/长值,而是做了许多额外的扰码。甚至还有一个循环:https://github.com/mardambey/mypipe/blob/master/avro/lang/java/avro/src/main/java/org/apache/avro/io/DirectBinaryEncoder.java#L90

我似乎在协议缓冲器文档或Avro文档中找不到,或者我自己也找不到,这样加扰数字有什么好处?为什么编码后将正数和负数交替比较好呢?

为什么它们不只是用小终端、大端、网络顺序写成,只需要将它们读入内存,并可能逆转比特的盲目性呢?我们用性能来买什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-26 10:23:38

它是一个可变长度的7位编码.编码值的第一个字节设置为0,随后的字节设置为1。这是译码器用来编码该值的字节数。无论机器架构如何,字节顺序总是很少的。

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

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

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33935266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档