Protocol Buffers (ProtoBuf) in Go

Kamna Garg
4 min readMay 20, 2023

Buckle up, folks! This time we’re diving into the world of Protocol Buffers (protobuf) and their superpowers in data serialization.

Introduction

Protocol Buffers, also referred to as protobuf, is a language-agnostic binary serialization format that has been developed by Google. Its primary purpose is to efficiently serialize structured data for inter-system communication and data storage.

[Image source: Google]

Major benefits of protobuf :

  1. Compactness: Protobuf provides efficient serialization, resulting in smaller message sizes for improved bandwidth usage.
  2. Schema Evolution: Protobuf supports schema evolution without breaking compatibility, allowing seamless updates to data structures.
  3. Efficient Serialization and Deserialization: Protobuf offers fast and efficient serialization, improving overall system performance.
  4. Cross-Platform Support: Protobuf allows seamless data exchange across different platforms and languages.

These benefits make protobuf a powerful tool for efficient data communication and storage in Go applications.

How It Is Better Than JSON and XML:

[Image source: Google]

XML, known as Extensible Markup Language, is like a map that helps organize and structure data using tags. It presents information in a way that both humans and machines can understand. However, XML can be wordy and take up more space, which may slow down performance and make data transmission less efficient.

JSON, or JavaScript Object Notation, is like a messenger that uses a simple key-value structure to represent data objects. It has become popular for transmitting data between web services because it is easy to read and work with. But JSON’s text-based format can result in larger file sizes, which can affect the speed of data transfer.

In contrast, Protocol Buffers (protobuf) shine in the world of data serialization. It’s like a magic trick that transforms data into a compact and efficient binary format. Protobuf is known for its fast data processing and the ability to adapt to changing data structures without breaking compatibility. It can be used with different programming languages and ensures the reliability of your data.

In summary, XML and JSON have their uses, but if you need a powerful and efficient data serialization solution, Protocol Buffer (protobuf) is the way to go. It provides compactness, speed, flexibility, and compatibility, making it a top choice for handling data efficiently.

The Serialization Performance: Protocol Buffers vs. JSON in Golang

Enough Talk, Let’s Get Our Hands Dirty

[Image source: Google]
  1. Visit the official Protocol Buffers GitHub repository (https://github.com/protocolbuffers/protobuf) to download the compiler compatible with your operating system.

2. Define a protobuf message schema using the .proto file format.

3. Compile the file

protoc — go_out=. ./*proto

This command generates Go code bindings from the protobuf schema. The --go_out flag specifies that the output should be in Go. This will generate a msg.pb.go file, that contains the necessary code bindings for your protobuf schema.

4. Implement a benchmark test in Golang that serializes a large dataset using both protobuf and JSON:

5. Based on the benchmark results (shown below), it is evident that Protobuf outperforms JSON serialization in terms of speed. The protobuf serialization benchmark was completed in significantly less time compared to the JSON serialization benchmark.

Memory Performance Comparison: JSON vs. Protocol Buffers

  1. Implement a benchmark test in Golang that compares memory usage of a large dataset using both protobuf and JSON:

2. The benchmark results show that JSON serialization used more memory compared to Protobuf serialization. On average, JSON serialization consumed around 0.2052 MB of memory, while protobuf serialization used only about 0.2042 MB. Although the difference is small, it’s clear that protobuf is more efficient in terms of memory usage. This means that protobuf’s compact binary format helps save memory, making it a good choice for working with large datasets and improving performance.

Conclusion

It’s conclusion time now !!!

Protocol Buffers (protobuf) have demonstrated superior performance and memory efficiency compared to JSON serialization in Golang. With its compact binary format and efficient serialization mechanism, protobuf offers smaller message sizes, improved network efficiency, and reduced bandwidth usage. Additionally, its schema evolution capabilities allow for seamless updates to data models. While JSON has its strengths, protobuf excels in scenarios that demand high-speed and memory-efficient data serialization, enabling optimized data transmission and improved system performance.

[Image Source: Google]

The complete codebase for the examples discussed in this article is available on the Git repository.

--

--

Kamna Garg

Software Developer, Women in tech, Seeker, Love writing, Always a student, IIT Kanpur