一、实验性能结果

从性能角度:

序列化:gogo/protobuf的gofast插件性能最好(是json的5倍、golang/protobuf的6倍、gogo/protobuf的gogo插件的8倍)
反序列化:gogo/protobuf的gofast插件性最好(是json的6倍、golang/protobuf的3.3倍、gogo/protobuf的gogo插件的2.5倍)

从内存占用角度:

序列化:gogo/protobuf的gofast插件内存占用最少(是json的1/6、golang/protobuf的1/4、gogo/protobuf的gogo插件的1/7)
反序列化:gogo/protobuf的gofast插内存占用最少(与json相当、golang/protobuf的1/1.5、gogo/protobuf的1/1.2)

从序列化以后的二进制大小角度:

protobuf相比于json要小;json大约是protobuf的1.5倍

二、实验环境:Mac Pro 16C16G1.5T

三、实验数据:

var JudgeItemModel = model.JudgeItem{
    Endpoint:  "172.12.12.12",
    Metric:    "docker_cpu_util",
    Value:     70,
    Timestamp: 1656155443,
    JudgeType: "JUDGE",
    Tags: map[string]string{
        "key1":"value1",
        "key2":"value1",
        "key3":"value1",
        "key4":"value1",
    },
}

var JudgeItemsModel = model.JudgeItems{
    JudgeItem: []*model.JudgeItem{
        &JudgeItemModel,
    },
}

四、测试场景

1、golang自带的json序列化/反序列化(json.Marshal/Unmarshal)
2、golang/protobuf
3、gogo/protobuf提供gogo插件
4、gogo/protobuf提供的gofast插件

BenchMark执行命令:go test -benchtime=5s -bench=. -benchmem -cpu=8

Marshal测试结果

BenchmarkJsonMarshal-8             3753434    1600 ns/op   213.0 marshaledBytes  896 B/op    16 allocs/op
BenchmarkGolangProtobufMarshal-8   3284922    1804 ns/op   132.0 marshaledBytes  656 B/op    21 allocs/op
BenchmarkGogoProtobufMarshal-8     2809514    2137 ns/op   132.0 marshaledBytes  1040 B/op   37 allocs/op
BenchmarkGofastProtobufMarshal-8   19904810   301.9 ns/op  132.0 marshaledBytes  144 B/op     1 allocs/op

Unmarshal测试结果

BenchmarkJsonUnmarshal-8             1497835              3970 ns/op             592 B/op         29 allocs/op
BenchmarkGolangProtobufUnmarshal-8   3094698              1920 ns/op             816 B/op         31 allocs/op
BenchmarkGogoProtobufUnmarshal-8     4156102              1440 ns/op             688 B/op         23 allocs/op
BenchmarkGofastProtobufUnmarshal-8   10006056              597.3 ns/op           560 B/op         15 allocs/op