cosmos-proto
cosmos-proto copied to clipboard
feat: speed up ProtoMethods
The ProtoMethods is called for every unmarshal, which in turn allocates an protoiface.Methods. The Methods object does not refer to a partucular message object, so the allocation can be saved by one-time initialization at startup.
Found by the the alecthomas/go_serialization_benchmarks suite:
go test -bench='Pulsar' -memprofile mem.out -cpu 6 ./
Before: goos: darwin goarch: arm64 pkg: github.com/alecthomas/go_serialization_benchmarks Benchmark_Pulsar_Marshal-6 7480744 154.1 ns/op 51.57 B/serial 96 B/op 2 allocs/op Benchmark_Pulsar_Unmarshal-6 5057922 236.9 ns/op 51.60 B/serial 256 B/op 7 allocs/op
After: Benchmark_Pulsar_Marshal-6 7251019 153.9 ns/op 51.57 B/serial 96 B/op 2 allocs/op Benchmark_Pulsar_Unmarshal-6 6409070 187.2 ns/op 51.63 B/serial 160 B/op 5 allocs/op
CC @tac0turtle @odeke-em
Added another optimization. Let me know if they belong in separate PRs.
I believe the remaining allocations are intrinsic to the serialization process, and thus cannot be reduced further.