Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation:
The client state machine holds state in an enum with associated data.
When the associated data is modified it can trigger a CoW for any heap
allocated data since there are two instances of that state: the one held
by the state machine, and the one being modified. This is particularly
bad when reading response data as the relevant states hold a message
reader which in turn holds a buffer accumulating message bytes. Every
time we append to that buffer we end up copying its underlying bytes and
then immediately throwing them away when we update the state held by the
state machine. This is especially bad for large responses which are
delivered in multiple frames.
Modifications:
multiple frames
underlying state
to read is a message, ensure we reserve enough capacity for the buffer
to append or the remaining bytes required for the next message to
read, whichever is larger.
Result:
allocations drop by ~5x.