mirror of
https://github.com/protocolbuffers/protobuf-go.git
synced 2025-02-22 03:40:55 +00:00
Avoid using protobuf reflection on map values in the fast path. Range operations in particular are expensive in protoreflect, because the closure passed to Map.Range escapes. Iterate maps using a reflect.MapIter when available. When operating on maps of messages where we have a *MessageInfo for the message type, directly jump to the fast-path *MessageInfo methods rather than passing through the proto package. Benchmarks deltas for a google.protobuf.Struct with JSON represention: {"parameters":{"a":{"b":{"c":{"d":{"e":{"f":{"g":{}}}}}}}}} Compared to previous revision: name old time/op new time/op delta NestedStruct/Size 7.22µs ± 2% 4.84µs ± 2% -32.96% (p=0.000 n=8+8) NestedStruct/Size-8 9.30µs ± 2% 5.89µs ± 2% -36.60% (p=0.000 n=8+8) NestedStruct/Marshal 77.6µs ±12% 9.8µs ± 4% -87.33% (p=0.000 n=8+8) NestedStruct/Marshal-8 91.6µs ± 2% 11.9µs ± 2% -86.99% (p=0.000 n=8+8) NestedStruct/Unmarshal 11.5µs ± 4% 8.7µs ± 2% -24.76% (p=0.000 n=8+8) NestedStruct/Unmarshal-8 15.4µs ± 4% 11.9µs ± 2% -22.41% (p=0.000 n=8+8) Compared to github.com/golang/protobuf: name old time/op new time/op delta NestedStruct/Size 5.42µs ± 1% 4.84µs ± 2% -10.61% (p=0.000 n=8+8) NestedStruct/Size-8 6.34µs ± 2% 5.89µs ± 2% -7.10% (p=0.000 n=8+8) NestedStruct/Marshal 12.5µs ± 2% 9.8µs ± 4% -21.41% (p=0.000 n=7+8) NestedStruct/Marshal-8 14.1µs ± 3% 11.9µs ± 2% -15.52% (p=0.000 n=8+8) NestedStruct/Unmarshal 9.66µs ± 1% 8.65µs ± 2% -10.40% (p=0.000 n=7+8) NestedStruct/Unmarshal-8 11.7µs ± 3% 11.9µs ± 2% +1.95% (p=0.038 n=8+8) Change-Id: I0effe6491f30d41f31904777f74eca3ac3694db3 Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/211737 Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>