mirror of
https://github.com/protocolbuffers/protobuf-go.git
synced 2025-01-04 02:38:50 +00:00
524c60670a
Change the representation of option flags in protoiface from bools to a bitfield. This brings the representation of options in protoiface in sync with that in internal/impl. This change has several benefits: 1. We will probably find that we need to add more option flags over time. Converting to the more efficient representation of these flags as high in the call stack as possible minimizes the performance implication of the struct growing. 2. On a similar note, this avoids the need to convert from the compact representation to the larger one when passing from internal/impl to proto, since the {Marshal,Unmarshal}State methods take the compact form. 3. This removes unused options from protoiface. Instead of documenting that AllowPartial is always set, we can just not include an AllowPartial flag in the protoiface options. 4. Conversely, this provides a way to add option flags to protoiface that we don't want to expose in the proto package. name old time/op new time/op delta EmptyMessage/Wire/Marshal-12 11.1ns ± 7% 10.1ns ± 1% -9.35% (p=0.000 n=8+8) EmptyMessage/Wire/Unmarshal-12 7.07ns ± 0% 6.74ns ± 1% -4.58% (p=0.000 n=8+8) EmptyMessage/Wire/Validate-12 4.30ns ± 1% 3.80ns ± 8% -11.45% (p=0.000 n=7+8) RepeatedInt32/Wire/Marshal-12 1.17µs ± 1% 1.21µs ± 7% +4.09% (p=0.000 n=8+8) RepeatedInt32/Wire/Unmarshal-12 938ns ± 0% 942ns ± 3% ~ (p=0.178 n=7+8) RepeatedInt32/Wire/Validate-12 521ns ± 4% 543ns ± 7% ~ (p=0.157 n=7+8) Required/Wire/Marshal-12 97.2ns ± 1% 95.3ns ± 1% -1.98% (p=0.001 n=7+7) Required/Wire/Unmarshal-12 41.0ns ± 9% 38.6ns ± 3% -5.73% (p=0.048 n=8+8) Required/Wire/Validate-12 25.4ns ±11% 21.4ns ± 3% -15.62% (p=0.000 n=8+7) Change-Id: I3ac1b00ab36cfdf61316ec087a5dd20d9248e4f6 Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/216760 Reviewed-by: Joe Tsai <joetsai@google.com>
56 lines
1.5 KiB
Go
56 lines
1.5 KiB
Go
// Copyright 2020 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package protoreflect
|
|
|
|
import (
|
|
"google.golang.org/protobuf/internal/pragma"
|
|
)
|
|
|
|
// The following types are used by the fast-path Message.ProtoMethods method.
|
|
//
|
|
// To avoid polluting the public protoreflect API with types used only by
|
|
// low-level implementations, the canonical definitions of these types are
|
|
// in the runtime/protoiface package. The definitions here and in protoiface
|
|
// must be kept in sync.
|
|
type (
|
|
methods = struct {
|
|
pragma.NoUnkeyedLiterals
|
|
Flags supportFlags
|
|
Size func(Message, marshalOptions) int
|
|
Marshal func(Message, marshalInput, marshalOptions) (marshalOutput, error)
|
|
Unmarshal func(Message, unmarshalInput, unmarshalOptions) (unmarshalOutput, error)
|
|
IsInitialized func(Message) error
|
|
}
|
|
supportFlags = uint64
|
|
marshalInput = struct {
|
|
pragma.NoUnkeyedLiterals
|
|
Buf []byte
|
|
}
|
|
marshalOutput = struct {
|
|
pragma.NoUnkeyedLiterals
|
|
Buf []byte
|
|
}
|
|
marshalOptions = struct {
|
|
pragma.NoUnkeyedLiterals
|
|
Flags uint8
|
|
}
|
|
unmarshalInput = struct {
|
|
pragma.NoUnkeyedLiterals
|
|
Buf []byte
|
|
}
|
|
unmarshalOutput = struct {
|
|
pragma.NoUnkeyedLiterals
|
|
Initialized bool
|
|
}
|
|
unmarshalOptions = struct {
|
|
pragma.NoUnkeyedLiterals
|
|
Flags uint8
|
|
Resolver interface {
|
|
FindExtensionByName(field FullName) (ExtensionType, error)
|
|
FindExtensionByNumber(message FullName, field FieldNumber) (ExtensionType, error)
|
|
}
|
|
}
|
|
)
|