Reduce the size of the pipe (#49270)
authorDavid Fowler <davidfowl@gmail.com>
Mon, 8 Mar 2021 06:58:05 +0000 (22:58 -0800)
committerGitHub <noreply@github.com>
Mon, 8 Mar 2021 06:58:05 +0000 (22:58 -0800)
commit108d82802754e81e972079fc17c5bcab283031b6
tree6bef6461696df535102ec24e64b3f788bd3e9a57
parentacbbb505492244b4c07a4a368257ba86a1fc02e1
Reduce the size of the pipe (#49270)

- Use the pipe itself as the synchronization object
- Store the options instance as a way to reference shared settings
- Added a field to PipeOptions for storing if the Pool is the ArrayPool implementation of the MemoryPool
- Shrink PipeAwaitable in the common case
  - Move the ExecutionContext and SynchronizationContext into a typed called the SchedulingContext. These types are mostly used with async await and it's extremely rare to have to capture any of this state.
- Shrink the size of PipeCompletion
  - Since completion callbacks are deprecated they are rarely set. We remove the pool and the other fields and just store a list (which should be rarely used now).
- Reduce the default segment pool size to 4 items = 16K buffered
  - The original size was optimized to avoid pool resizes but we need to balance idle memory and the potential resize cost of the resize.
src/libraries/System.IO.Pipelines/src/System.IO.Pipelines.csproj
src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/Pipe.cs
src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/PipeAwaitable.cs
src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/PipeCompletion.cs
src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/PipeCompletionCallbacks.cs
src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/PipeOptions.cs
src/libraries/System.IO.Pipelines/tests/BufferSegmentPoolTest.cs