Choosing the right integer type
Protobuf is mostly performant because of its binary format and because of its representation of integers. While some types such as strings are serialized “as is” and prepended with the field tag, type, and length, numbers – especially integers – are generally serialized in way fewer bits than how they are laid out in your computer memory.
However, you might have noticed that I said “generally serialized.” This is because if you chose the wrong integer type for your data, the varint
encoding algorithm might encode an int32
into 5 bytes or more, whereas, in memory, it is 4 bytes.
Let us see an example of a bad choice of integer type. Let us say that we want to encode the value 268,435,456. We can check how this value would be serialized in memory and with Protobuf by using the unsafe.Sizeof
function from the Go standard library and the proto.Marshal
function provided by Protobuf. And finally, we are also...