Add IO::Sized#remaining=(value) to reuse an existing instance #10520
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.
IO::Sized
is an excellent abstraction for segmenting anIO
and gives you the tools to ensure that that segment is completely consumed when you leave a block regardless of whether it was consumed inside the block itself. But if you need to segment thatIO
into a lot of small-ish chunks you end up re-allocating hundreds, thousands, or even millions ofIO::Sized
instances, which can involve a lot ofmalloc
, GC, andfree
calls.You can see the impact in this PR to
will/crystal-pg
where we reduced CPU usage by 73% for a Postgres query that returns 500k values (5 columns x 100k rows). In that PR @straight-shoota recommended adding that functionality directly toIO::Sized
.