ZigZag richiede un sacco di spese generali per scrivere/leggere i numeri. In realtà sono rimasto sbalordito nel constatare che non solo scrive valori int/long così come sono, ma fa un sacco di ulteriori rimescolamenti. C'è anche un ciclo coinvolti: https://github.com/mardambey/mypipe/blob/master/avro/lang/java/avro/src/main/java/org/apache/avro/io/DirectBinaryEncoder.java#L90Qual è il motivo della codifica ZigZag in Protocol Buffers e Avro?
Non mi sembra di essere in grado di trovare in buffer protocollo documenti o in documenti Avro, o ragionare me stesso, qual è il vantaggio di scrambling numeri del genere? Perché è meglio avere numeri positivi e negativi alternati dopo la codifica?
Perché non sono solo scritti in little-endian, big-endian, ordine di rete che richiederebbe solo di leggerli in memoria e possibilmente invertire bit-endianness? Cosa acquistiamo pagando con le prestazioni?
Se sei interessato a qualcosa di protobuf che non fa costose codifiche varint, vedi https://capnproto.org. È più veloce ma richiede più spazio sul cavo. (Divulgazione: Sono l'autore di Cap'n Proto e anche l'autore della maggior parte del codice Protobuf open source di Google.) –
@KentonVarda Grazie per le informazioni, non ero a conoscenza di Cap'n'proto. Aggiunto al mio protocollo Toolbelt. – Endrju
I buffer di protocollo, almeno a partire dalla versione 2, consentono di utilizzare numeri interi codificati a dimensione fissa (ad es. - fixed32, sfixed64, ecc.) Se questo ha più senso per l'applicazione. Ad esempio, se i tuoi valori saranno distribuiti uniformemente attraverso il possibile intervallo di valori, allora vuoi usare la forma fissa piuttosto che la forma variabile. Detto questo, è molto comune per valori comunemente usati raggruppare vicino a zero dove questo tipo di codifica a lunghezza variabile può risparmiare molto spazio. – jschultz410