如何在没有idl和codegen的情况下快速获取protobuf值

205 阅读2分钟

GoDoc

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/opallocs/op
GoProtobufTiny-12使用protobuf整顿有效载荷140ns ± 2%52.0B ± 0%2.00 ± 0%
GpbTiny-12使用gpb的Tiny有效载荷42.9ns ± 80.00B0.00
GoProtobufSmall-12使用protobuf的小型有效载荷3.82µs ± 4%2.50kB ± 089.0 ± 0%
GpbSmall-12使用gpb的小型有效载荷77.8ns ± 4%0.00B0.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"
    }
}