* codec: remove unnecessary allocations in ProtoCodec.MarshalBinaryLengthPrefixed Improve ProtoCodec.MarshalBinaryLengthPrefixed by removing the need to use a *bytes.Buffer and instead use an array and invoke binary.PutUvarint, and directly create the respective length prefixed concatentation. With this change we get the following improvement in all dimenions of throughput, bytes allocated, number of allocations per operation. ```shell $ benchstat before.txt after.txt name old time/op new time/op delta ProtoCodecMarshalBinaryLengthPrefixed-8 295ns ± 2% 177ns ± 3% -39.92% (p=0.000 n=20+20) name old speed new speed delta ProtoCodecMarshalBinaryLengthPrefixed-8 505MB/s ± 2% 841MB/s ± 3% +66.44% (p=0.000 n=20+20) name old alloc/op new alloc/op delta ProtoCodecMarshalBinaryLengthPrefixed-8 576B ± 0% 336B ± 0% -41.67% (p=0.000 n=20+20) name old allocs/op new allocs/op delta ProtoCodecMarshalBinaryLengthPrefixed-8 5.00 ± 0% 3.00 ± 0% -40.00% (p=0.000 n=20+20) ``` Fixes #6875 * Address @marbar3778's feedback Use binary.MaxVarintLen64 instead of 10 Co-authored-by: Marko <marbar3778@yahoo.com> Co-authored-by: Marko <marbar3778@yahoo.com> Co-authored-by: Aaron Craelius <aaron@regen.network>
58 lines
1.7 KiB
Go
58 lines
1.7 KiB
Go
package codec
|
|
|
|
import (
|
|
"github.com/gogo/protobuf/proto"
|
|
|
|
"github.com/cosmos/cosmos-sdk/codec/types"
|
|
)
|
|
|
|
type (
|
|
// Marshaler defines the interface module codecs must implement in order to support
|
|
// backwards compatibility with Amino while allowing custom Protobuf-based
|
|
// serialization. Note, Amino can still be used without any dependency on
|
|
// Protobuf. There are three typical implementations that fulfill this contract:
|
|
//
|
|
// 1. AminoCodec: Provides full Amino serialization compatibility.
|
|
// 2. ProtoCodec: Provides full Protobuf serialization compatibility.
|
|
Marshaler interface {
|
|
BinaryMarshaler
|
|
JSONMarshaler
|
|
}
|
|
|
|
BinaryMarshaler interface {
|
|
MarshalBinaryBare(o ProtoMarshaler) ([]byte, error)
|
|
MustMarshalBinaryBare(o ProtoMarshaler) []byte
|
|
|
|
MarshalBinaryLengthPrefixed(o ProtoMarshaler) ([]byte, error)
|
|
MustMarshalBinaryLengthPrefixed(o ProtoMarshaler) []byte
|
|
|
|
UnmarshalBinaryBare(bz []byte, ptr ProtoMarshaler) error
|
|
MustUnmarshalBinaryBare(bz []byte, ptr ProtoMarshaler)
|
|
|
|
UnmarshalBinaryLengthPrefixed(bz []byte, ptr ProtoMarshaler) error
|
|
MustUnmarshalBinaryLengthPrefixed(bz []byte, ptr ProtoMarshaler)
|
|
|
|
types.AnyUnpacker
|
|
}
|
|
|
|
JSONMarshaler interface {
|
|
MarshalJSON(o interface{}) ([]byte, error)
|
|
MustMarshalJSON(o interface{}) []byte
|
|
|
|
UnmarshalJSON(bz []byte, ptr interface{}) error
|
|
MustUnmarshalJSON(bz []byte, ptr interface{})
|
|
}
|
|
|
|
// ProtoMarshaler defines an interface a type must implement as protocol buffer
|
|
// defined message.
|
|
ProtoMarshaler interface {
|
|
proto.Message // for JSON serialization
|
|
|
|
Marshal() ([]byte, error)
|
|
MarshalTo(data []byte) (n int, err error)
|
|
MarshalToSizedBuffer(dAtA []byte) (int, error)
|
|
Size() int
|
|
Unmarshal(data []byte) error
|
|
}
|
|
)
|