Improve performance of NIOAsyncChannel
#2539
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.
Motivation:
There were a couple of easy performance wins in
NIOAsyncChannel
which cut the allocations in half again. Those performance wins are mostly around the underlyingNIOAsyncWriter
andNIOAsyncSequenceProducer
.Modifications:
This PR contains a few changes which split up into separate commits to make reviewing easier:
NIOAsyncChannelInboundStreamChannelHandlerProducerDelegate
which allows it to skip the thread hop when we are already on the correctEventLoop
._TinyArray
implementation fromswift-certificates
to optimise the fast path of having just a single producer suspended in theNIOAsyncWriter
.NIOAsyncWriterSinkDelegate
customization point for single element writes in theNIOAsyncChannelOutboundWriterHandler
. This avoids allocating aDeque
for single element writes.NIOAsyncWriter
and I moved the storage of thesuspendedYield
s to the_TinyArray
which optimises for the single producer case.Result:
Halved the allocations for the
NIOAsyncChannel
benchmark again.