Reduces heap allocations for the some byte[] uses #1272
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.
Profiling reveals that creation of
byte[4]
arrays are our most common heap objects. Many of these come from reading integers from the byte stream where we allocate a smallbyte[4]
orbyte[8]
array and then convert it to a 32 or 64-bit integer.Results from a simple test of using the
SftpClient
to upload and download some files:Before: when byte[] arrays were created for each integer read
After: when byte[] are allocated and read from the stack
Changes
SshDataStream.ReadBytes
overload that supportsSpan<byte>
for .NET Standard 2.1+ and .NET 6+ targets.SshDataStream.ReadUInt32
andSshDataStream.ReadUInt64
to read onto the stack and use newerBinaryPrimitives
class for integer conversion for .NET Standard 2.1+ and .NET 6+ targets.SshData.ReadUInt32
andSshData.ReadUInt64
to use the existing stream methods to avoid another temporary buffer.