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文档中找到答案,也不能自行推理,为什么这种数字混淆有优势?为什么在编码后正负数会交替出现才更好?为什么不只是以小端、大端或网络顺序写入,这只需要将它们读入内存,并可能反转位的顺序?我们用性能换取了什么?