syntax = "proto3"; package main; option go_package = "/;msgmodel"; // 堆代码 duidaima.com message MyMessage { int32 id = 1; string name = 2; string email = 3; }1. 编译文件
protoc — go_out=. ./*proto这个命令从 protobuf 模式生成 Go 代码绑定。--go_out 标志指定输出应为 Go 语言。这将生成一个 msg.pb.go 文件,其中包含您的 protobuf 模式所需的代码绑定。
package main import ( "encoding/json" "github.com/golang/protobuf/proto" "go-protobuf/model/message" "log" "testing" ) const ( iteration = 10000000 //Number of iterations for the benchmark test ) func generateDataset() []*message.MyMessage { var dataset []*message.MyMessage for i := 0; i < iteration; i++ { data := &message.MyMessage{ Email: "johndoe@example.com", Name: "John Doe", Id: int32(i), } dataset = append(dataset, data) } return dataset } func BenchmarkProtobufSerialisation(b *testing.B) { dataset := generateDataset() b.ResetTimer() for n := 0; n < b.N; n++ { for _, data := range dataset { _, err := proto.Marshal(data) if err != nil { log.Fatal(err) } } } } func BenchmarkJSONSerialization(b *testing.B) { dataset := generateDataset() b.ResetTimer() for n := 0; n < b.N; n++ { for _, data := range dataset { _, err := json.Marshal(data) if err != nil { log.Fatal(err) } } } } func main() { // Run the benchmark tests testing.Benchmark(BenchmarkProtobufSerialisation) testing.Benchmark(BenchmarkJSONSerialization) }3. 根据基准测试结果(如下所示),很明显,就速度而言,Protocol Buffers(Protobuf)的序列化性能优于 JSON。与 JSON 的序列化基准测试相比,Protobuf 的序列化基准测试完成时间明显较短。
package main import ( "encoding/json" "github.com/golang/protobuf/proto" "go-protobuf/model/message" "log" "runtime" "runtime/debug" "testing" ) const ( iteration = 100000000 //Number of iterations for the benchmark test ) func generateDataset() []*message.MyMessage { var dataset []*message.MyMessage for i := 0; i < iteration; i++ { data := &message.MyMessage{ Email: "johndoe@example.com", Name: "John Doe", Id: int32(i), } dataset = append(dataset, data) } return dataset } func BenchmarkProtobufSerialisation(b *testing.B) { dataset := generateDataset() b.ResetTimer() for n := 0; n < b.N; n++ { for _, data := range dataset { _, err := proto.Marshal(data) if err != nil { log.Fatal(err) } } } measureMemoryUsage(b) } func BenchmarkJSONSerialization(b *testing.B) { dataset := generateDataset() b.ResetTimer() for n := 0; n < b.N; n++ { for _, data := range dataset { _, err := json.Marshal(data) if err != nil { log.Fatal(err) } } } measureMemoryUsage(b) } func measureMemoryUsage(b *testing.B) { debug.FreeOSMemory() var mem runtime.MemStats runtime.GC() runtime.ReadMemStats(&mem) b.ReportMetric(float64(mem.Alloc)/1024/1024, "Memory_MB") } func main() { // Run the benchmark tests testing.Benchmark(BenchmarkProtobufSerialisation) testing.Benchmark(BenchmarkJSONSerialization) }2. 尽管差异很小,但基准测试结果表明,与 Protobuf 序列化相比,JSON 序列化使用了更多的内存。平均而言,JSON 序列化消耗了约 0.2052 MB 的内存,而 Protobuf 序列化仅使用了约 0.2042 MB。尽管差异很小,但很明显 Protobuf 在内存使用方面更加高效。这意味着 Protobuf 的紧凑二进制格式有助于节省内存,使其成为处理大型数据集和提高性能的良好选择。
结论
现在是总结的时候了!!!