Eliminate a redundant alloc+copy of each frame #2852
Merged
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.
Description
The streaming code is copying the entire frame into a new
std::vector
(using the slowstd::back_inserter()
too) just to prepend the frame header, right before it copies it a second time to insert the packet headers. We can easily consolidate these operations into one to prevent a useless allocation and copy of every frame we encode.This isn't the only redundant copy left (
fec::encode()
does one), but it's the only one that's easy to get rid of. Removing more copies requires scatter/gather I/O support inplatf::send()
/platf::send_batch()
to allow us to submit separate buffers for the header and payload data of each packet. It's not that hard to support S/G, but it's tricky to actually use due to the myriad frame/packet headers (some of which participate in FEC, while others don't).I also included another change to optimize the copy in
fec::encode()
. It turns out GCC was generating horrible assembly that was doing a byte-by-byte copy of each frame rather than using the optimized__builtin_memmove()
as was the case for thestd::copy()
inconcat_and_insert()
.Screenshot
Issues Fixed or Closed
Type of Change
.github/...
)Checklist
Branch Updates
LizardByte requires that branches be up-to-date before merging. This means that after any PR is merged, this branch
must be updated before it can be merged. You must also
Allow edits from maintainers.