GPB是一个受tidwall/gjson启发的Go包,它提供了一种快速而简单的方法来获取protobuf二进制信息中的字段。
开始使用
安装
通过简单的运行go get 来安装该包:
➜ go get -u github.com/ywx217/gpb
性能
GPB和golang/protobuf的基准测试在gpb_test.go中,每个操作从编码的protobuf数据中获得一个int32值。
这些基准是在MacBook Pro 15″Intel Corei7@2.20GHz 上运行的,使用make bench-compare 来重现这些结果:
| 名称 | 描述 | 时间/操作 | allocs/op | allocs/op |
|---|---|---|---|---|
| GoProtobufTiny-12 | 使用protobuf整顿有效载荷 | 140ns ± 2% | 52.0B ± 0% | 2.00 ± 0% |
| GpbTiny-12 | 使用gpb的Tiny有效载荷 | 42.9ns ± 8 | 0.00B | 0.00 |
| GoProtobufSmall-12 | 使用protobuf的小型有效载荷 | 3.82µs ± 4% | 2.50kB ± 0 | 89.0 ± 0% |
| GpbSmall-12 | 使用gpb的小型有效载荷 | 77.8ns ± 4% | 0.00B | 0.00 |
测试数据
整齐的有效载荷,大小=2B
GoEnum {
foo:FOO1
}
小型有效载荷,大小=451B
GoTest {
Kind: TIME
RequiredField: {
Label: "label"
Type: "type"
}
RepeatedField: {
Label: "label"
Type: "type"
}
RepeatedField: {
Label: "label"
Type: "type"
}
F_Bool_required: true
F_Int32_required: 3
F_Int64_required: 6
F_Fixed32_required: 32
F_Fixed64_required: 64
F_Uint32_required: 3232
F_Uint64_required: 6464
F_Float_required: 3232
F_Double_required: 6464
F_String_required: "string"
F_Bytes_required: "bytes"
F_Sint32_required: -32
F_Sint64_required: -64
F_Sfixed32_required: -32
F_Sfixed64_required: -64
F_Bool_repeated: false
F_Bool_repeated: true
F_Int32_repeated: 32
F_Int32_repeated: 33
F_Int64_repeated: 64
F_Int64_repeated: 65
F_Fixed32_repeated: 3232
F_Fixed32_repeated: 3333
F_Fixed64_repeated: 6464
F_Fixed64_repeated: 6565
F_Uint32_repeated: 323232
F_Uint32_repeated: 333333
F_Uint64_repeated: 646464
F_Uint64_repeated: 656565
F_Float_repeated: 32
F_Float_repeated: 33
F_Double_repeated: 64
F_Double_repeated: 65
F_String_repeated: "hello"
F_String_repeated: "sailor"
F_Bytes_repeated: "big"
F_Bytes_repeated: "nose"
F_Sint32_repeated: 32
F_Sint32_repeated: -32
F_Sint64_repeated: 64
F_Sint64_repeated: -64
F_Sfixed32_repeated: 32
F_Sfixed32_repeated: -32
F_Sfixed64_repeated: 64
F_Sfixed64_repeated: -64
F_Bool_defaulted: true
F_Int32_defaulted: 32
F_Int64_defaulted: 64
F_Fixed32_defaulted: 320
F_Fixed64_defaulted: 640
F_Uint32_defaulted: 3200
F_Uint64_defaulted: 6400
F_Float_defaulted: 314159
F_Double_defaulted: 271828
F_String_defaulted: "hello, \"world!\"\n"
F_Bytes_defaulted: "Bignose"
F_Sint32_defaulted: -32
F_Sint64_defaulted: -64
F_Sfixed32_defaulted: -32
F_Sfixed64_defaulted: -64
RequiredGroup: {
RequiredField: "required"
}
RepeatedGroup: {
RequiredField: "repeated"
}
RepeatedGroup: {
RequiredField: "repeated"
}
}