ZigZag需要大量的開銷來編寫/讀取數字。事實上,我驚呆了,看到它不僅僅寫出int/long值,而且還有很多額外的加擾。甚至有一個循環涉及: https://github.com/mardambey/mypipe/blob/master/avro/lang/java/avro/src/main/java/org/apache/avro/io/DirectBinaryEncoder.java#L90Protocol Buffers和Avro中ZigZag編碼背後的原因是什麼?
我似乎無法在協議緩衝區文檔或Avro文檔中找到,或自我推理,這樣的數字的優勢是什麼?爲什麼在編碼後交替使用正數和負數會更好?
爲什麼他們不只是寫在小端,大端,網絡秩序,只需要將它們讀入內存,並可能反轉位的字節順序?我們用性能購買什麼?
如果您對protobuf-like的東西感興趣,那麼它不會執行昂貴的varint編碼,請參閱https://capnproto.org。它速度更快,但它確實需要更多空間。 (披露:我是Cap'n Proto的作者,也是Google的大部分開源Protobuf代碼的作者。) –
@KentonVarda感謝您的信息,我不知道Cap'n'proto。添加到我的協議工具欄。 – Endrju
協議緩衝區至少從版本2開始,讓我們使用固定大小的編碼整數(例如 - fixed32,sfixed64等),如果這對您的應用程序更有意義。例如,如果您的值將在可能的值範圍內均勻分佈,那麼您希望使用固定格式而不是變量格式。這就是說,在這種簡單的可變長度編碼可以節省大量空間的情況下,通常使用的數值更接近於零。 – jschultz410