From 76c7989fc1f8a609ac78ed3431f30991587aa525 Mon Sep 17 00:00:00 2001 From: Nik Karpinsky Date: Wed, 29 Jul 2026 10:42:44 -0400 Subject: [PATCH] Reduce v1 channel offer allocations Encode channel names directly into a single byte array instead of constructing a temporary Sequence. | Metric | Baseline | Candidate | Improvement | |--------|---------:|----------:|------------:| | Mean | 103.13 ms | 90.44 ms | 12.3% | | Allocated | 9.16 MB | 5.43 MB | 40.7% | Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 6ee5d961-cc68-4ccd-b47c-2275b7a49c8c --- src/Nerdbank.Streams/MultiplexingStream.Formatters.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Nerdbank.Streams/MultiplexingStream.Formatters.cs b/src/Nerdbank.Streams/MultiplexingStream.Formatters.cs index 238a4832..70b30817 100644 --- a/src/Nerdbank.Streams/MultiplexingStream.Formatters.cs +++ b/src/Nerdbank.Streams/MultiplexingStream.Formatters.cs @@ -356,18 +356,17 @@ internal override long DeserializeContentProcessed(ReadOnlySequence payloa internal override unsafe ReadOnlySequence Serialize(Channel.OfferParameters offerParameters) { - var sequence = new Sequence(); - Span buffer = sequence.GetSpan(ControlFrameEncoding.GetMaxByteCount(offerParameters.Name.Length)); + byte[] buffer = new byte[ControlFrameEncoding.GetMaxByteCount(offerParameters.Name.Length)]; + int byteLength; fixed (byte* pBuffer = buffer) { fixed (char* pName = offerParameters.Name) { - int byteLength = ControlFrameEncoding.GetBytes(pName, offerParameters.Name.Length, pBuffer, buffer.Length); - sequence.Advance(byteLength); + byteLength = ControlFrameEncoding.GetBytes(pName, offerParameters.Name.Length, pBuffer, buffer.Length); } } - return sequence; + return new ReadOnlySequence(buffer, 0, byteLength); } internal override unsafe Channel.OfferParameters DeserializeOfferParameters(ReadOnlySequence payload)