Description
I have a client/server app that uses gRPC to communicate. Profiler shows that up to 12.6% of memory is allocated in consumeBytesNoZero()
.
The code is unmarshaling a message that has a bytes
(i.e. []byte
) field a few levels deep. Then that data is processed and then the message object/struct could be reused to read the next message into if it was possible, but I don't see how. I mean, I can reuse it but looking at the code, a new byte slice will be allocated in any case. The bytes
field is always up to N KB in size (client ensures that) so perfect for reuse on the server side. Is there any way to reuse the allocated memory that I don't see?
I see two ways:
- Add support for something like
Unmarshal()
to the message so that I could add custom unmarshaling logic or something like that. Ideally not a fixed method, actually, but a way to dynamically inject custom logic for a particular type. - Add an option to
UnmarshalOptions
specially for that case.
Perhaps combining the two is the best way forward - ability to inject dynamic unmarshaling code for types via UnmarshalOptions
?