diff --git a/README.md b/README.md
index e9c832c..3ca2b97 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # KZDev.PerfUtils
 
-This is the repository for the 'KZDev.PerfUtils' nuget package that contains the `MemoryStreamSlim` class; a high-performance, memory-efficient, and easy-to-use replacement for the `MemoryStream` class that provides particular benefits for large or frequently used streams.
+This is the repository for the ['KZDev.PerfUtils'](https://www.nuget.org/packages/KZDev.PerfUtils) nuget package that contains the `MemoryStreamSlim` class; a high-performance, memory-efficient, and easy-to-use replacement for the `MemoryStream` class that provides particular benefits for large or frequently used streams.
 
 ## Features
 
@@ -16,11 +16,15 @@ This is the repository for the 'KZDev.PerfUtils' nuget package that contains the
 
 The roadmap plan for this package is to add several additional helpful performance focused utilities. These will be forthcoming as time permits, so this first release is focused just on the `MemoryStreamSlim` class.
 
+## Documentation
+
+Full documentation for the package is available on the [PerfUtils Documentation](https://kzdev-net.github.io/kzdev.perfutils/) page.
+
 ## Contribution Guidelines
 
 At this time, I am not accepting external pull requests. However, any feedback or suggestions are welcome and can be provided through the following channels:
 
-- **Feature Requests:** Please use GitHub Discussions to propose new features or enhancements.
+- **Feature Requests:** Please use GitHub Discussions to discuss new new features or enhancements before opening a feature request. This will help ensure that your request is in line with the project's goals and vision.
 - **Bug Reports:** If you encounter any issues, feel free to open an issue so it can be addressed promptly.
 
 I appreciate your understanding and look forward to collaborating with you through discussions and issue tracking.
\ No newline at end of file
diff --git a/Source/Dev/KZDev.PerfUtils.Examples/InterlockedOperations/ConditionAndExample.cs b/Source/Dev/KZDev.PerfUtils.Examples/InterlockedOperations/ConditionAndExample.cs
new file mode 100644
index 0000000..be8d95e
--- /dev/null
+++ b/Source/Dev/KZDev.PerfUtils.Examples/InterlockedOperations/ConditionAndExample.cs
@@ -0,0 +1,13 @@
+namespace KZDev.PerfUtils.Examples
+{
+    public class ConditionXorExample
+    {
+        private int _flags;
+
+        public bool ToggleFlags (Predicate<int> condition, int flagBits)
+        {
+            (int originalValue, int newValue) = InterlockedOps.ConditionXor(ref _flags, condition, flagBits);
+            return originalValue != newValue;
+        }
+    }
+}
diff --git a/Source/Dev/KZDev.PerfUtils.Examples/InterlockedOperations/ConditionClearBitsExample.cs b/Source/Dev/KZDev.PerfUtils.Examples/InterlockedOperations/ConditionClearBitsExample.cs
new file mode 100644
index 0000000..7106820
--- /dev/null
+++ b/Source/Dev/KZDev.PerfUtils.Examples/InterlockedOperations/ConditionClearBitsExample.cs
@@ -0,0 +1,13 @@
+namespace KZDev.PerfUtils.Examples
+{
+    public class ConditionClearBitsExample
+    {
+        private int _flags;
+
+        public bool ClearFlags<T> (Func<int, T, bool> condition, T conditionArgument, int flagBits)
+        {
+            (int originalValue, int newValue) = InterlockedOps.ConditionClearBits(ref _flags, condition, conditionArgument, flagBits);
+            return originalValue != newValue;
+        }
+    }
+}
diff --git a/Source/Dev/KZDev.PerfUtils.Examples/InterlockedOperations/XorExample.cs b/Source/Dev/KZDev.PerfUtils.Examples/InterlockedOperations/XorExample.cs
new file mode 100644
index 0000000..f95f442
--- /dev/null
+++ b/Source/Dev/KZDev.PerfUtils.Examples/InterlockedOperations/XorExample.cs
@@ -0,0 +1,13 @@
+namespace KZDev.PerfUtils.Examples
+{
+    public class XorExample
+    {
+        private int _flag;
+
+        public bool ToggleFlag ()
+        {
+            int originalValue = InterlockedOps.Xor(ref _flag, 1);
+            return originalValue == 0;
+        }
+    }
+}
diff --git a/Source/Dev/KZDev.PerfUtils.Examples/KZDev.PerfUtils.Examples.csproj b/Source/Dev/KZDev.PerfUtils.Examples/KZDev.PerfUtils.Examples.csproj
new file mode 100644
index 0000000..e3371f5
--- /dev/null
+++ b/Source/Dev/KZDev.PerfUtils.Examples/KZDev.PerfUtils.Examples.csproj
@@ -0,0 +1,17 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Folder Include="MemoryStreamSlim\" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\Src\KZDev.PerfUtils\KZDev.PerfUtils.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/Source/Directory.Build.props b/Source/Directory.Build.props
index 99dd0a8..52f0289 100644
--- a/Source/Directory.Build.props
+++ b/Source/Directory.Build.props
@@ -8,4 +8,12 @@
         <Nullable>enable</Nullable>
         <LangVersion>latest</LangVersion>
     </PropertyGroup>
+    <!-- 
+    Define solution level package version properties
+   -->
+    <PropertyGroup Label="PackageVersions">
+	    <PerfUtils-Pkg-Microsoft_Extensions_Configuration>8.0.0</PerfUtils-Pkg-Microsoft_Extensions_Configuration>
+	    <PerfUtils-Pkg-Microsoft_Extensions_DependencyInjection>8.0.1</PerfUtils-Pkg-Microsoft_Extensions_DependencyInjection>
+	    <PerfUtils-Pkg-Microsoft_Extensions_Hosting>8.0.1</PerfUtils-Pkg-Microsoft_Extensions_Hosting>
+    </PropertyGroup>
 </Project>
diff --git a/Source/Docs/articles/MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-report-github.md b/Source/Docs/articles/MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-report-github.md
index 31d2865..b8056f4 100644
--- a/Source/Docs/articles/MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-report-github.md
+++ b/Source/Docs/articles/MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-report-github.md
@@ -10,162 +10,162 @@ Intel Core i9-14900K, 1 CPU, 32 logical and 24 physical cores
 ```
 | Method                                      | DataSize  | CapacityOnCreate | ZeroBuffers | GrowEachLoop | Mean       | Error     | StdDev    | Ratio | RatioSD | Gen0       | Gen1       | Gen2       | Allocated     | Alloc Ratio |
 |-------------------------------------------- |---------- |----------------- |------------ |------------- |-----------:|----------:|----------:|------:|--------:|-----------:|-----------:|-----------:|--------------:|------------:|
-| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **False**            | **False**       | **False**        |  **20.666 ms** | **0.1466 ms** | **0.1371 ms** |  **1.00** |    **0.01** | **21117.1875** | **21117.1875** | **21117.1875** |    **64946.5 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | False            | False       | False        |   1.823 ms | 0.0134 ms | 0.0126 ms |  0.09 |    0.00 |     5.8594 |          - |          - |     138.63 KB |       0.002 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | False            | False       | False        |   4.368 ms | 0.0232 ms | 0.0217 ms |  0.21 |    0.00 |          - |          - |          - |     142.59 KB |       0.002 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **False**            | **False**       | **False**        |  **20.441 ms** | **0.1538 ms** | **0.1285 ms** |  **1.00** |    **0.01** | **21117.1875** | **21117.1875** | **21117.1875** |    **64946.5 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | False            | False       | False        |   1.807 ms | 0.0069 ms | 0.0065 ms |  0.09 |    0.00 |     5.8594 |          - |          - |     138.63 KB |       0.002 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | False            | False       | False        |   1.853 ms | 0.0052 ms | 0.0046 ms |  0.09 |    0.00 |     5.8594 |          - |          - |     142.59 KB |       0.002 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **False**            | **False**       | **True**         |  **29.458 ms** | **0.5771 ms** | **0.6175 ms** |  **1.00** |    **0.03** | **30562.5000** | **30562.5000** | **30562.5000** |   **97017.35 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | False            | False       | True         |   2.618 ms | 0.0078 ms | 0.0069 ms |  0.09 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.002 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | False            | False       | True         |   2.747 ms | 0.0549 ms | 0.0539 ms |  0.09 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.001 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **False**            | **False**       | **True**         |  **29.188 ms** | **0.1181 ms** | **0.1047 ms** |  **1.00** |    **0.00** | **30570.3125** | **30570.3125** | **30570.3125** |   **97017.35 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | False            | False       | True         |   2.649 ms | 0.0070 ms | 0.0062 ms |  0.09 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.002 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | False            | False       | True         |   2.685 ms | 0.0124 ms | 0.0110 ms |  0.09 |    0.00 |     3.9063 |          - |          - |     142.59 KB |       0.001 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **False**            | **True**        | **False**        |  **19.324 ms** | **0.1041 ms** | **0.0974 ms** |  **1.00** |    **0.01** | **21117.1875** | **21117.1875** | **21117.1875** |    **64946.5 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | False            | True        | False        |   2.471 ms | 0.0034 ms | 0.0028 ms |  0.13 |    0.00 |     3.9063 |          - |          - |     138.63 KB |       0.002 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | False            | True        | False        |   2.651 ms | 0.0088 ms | 0.0082 ms |  0.14 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.002 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **False**            | **True**        | **False**        |  **19.586 ms** | **0.0917 ms** | **0.0858 ms** |  **1.00** |    **0.01** | **21117.1875** | **21117.1875** | **21117.1875** |    **64946.5 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | False            | True        | False        |   2.500 ms | 0.0092 ms | 0.0086 ms |  0.13 |    0.00 |     3.9063 |          - |          - |     138.63 KB |       0.002 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | False            | True        | False        |   2.614 ms | 0.0124 ms | 0.0110 ms |  0.13 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.002 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **False**            | **True**        | **True**         |  **28.971 ms** | **0.1455 ms** | **0.1361 ms** |  **1.00** |    **0.01** | **30570.3125** | **30570.3125** | **30570.3125** |   **97017.35 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | False            | True        | True         |   4.036 ms | 0.0438 ms | 0.0388 ms |  0.14 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.002 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | False            | True        | True         |   3.996 ms | 0.0440 ms | 0.0412 ms |  0.14 |    0.00 |          - |          - |          - |      142.6 KB |       0.001 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **False**            | **True**        | **True**         |  **29.344 ms** | **0.1182 ms** | **0.0987 ms** |  **1.00** |    **0.00** | **30562.5000** | **30562.5000** | **30562.5000** |   **97017.35 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | False            | True        | True         |   3.993 ms | 0.0145 ms | 0.0136 ms |  0.14 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.002 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | False            | True        | True         |   3.911 ms | 0.0188 ms | 0.0176 ms |  0.13 |    0.00 |          - |          - |          - |      142.6 KB |       0.001 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **True**             | **False**       | **False**        |  **19.417 ms** | **0.1103 ms** | **0.1031 ms** |  **1.00** |    **0.01** | **21117.1875** | **21117.1875** | **21117.1875** |    **64946.5 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | True             | False       | False        |   1.801 ms | 0.0042 ms | 0.0040 ms |  0.09 |    0.00 |     5.8594 |          - |          - |     138.63 KB |       0.002 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | True             | False       | False        |   1.845 ms | 0.0061 ms | 0.0054 ms |  0.10 |    0.00 |     5.8594 |          - |          - |     142.59 KB |       0.002 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **True**             | **False**       | **False**        |  **19.508 ms** | **0.0663 ms** | **0.0621 ms** |  **1.00** |    **0.00** | **21117.1875** | **21117.1875** | **21117.1875** |    **64946.5 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | True             | False       | False        |   1.805 ms | 0.0039 ms | 0.0036 ms |  0.09 |    0.00 |     5.8594 |          - |          - |     138.63 KB |       0.002 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | True             | False       | False        |   1.855 ms | 0.0066 ms | 0.0062 ms |  0.10 |    0.00 |     5.8594 |          - |          - |     142.59 KB |       0.002 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **True**             | **False**       | **True**         |  **28.910 ms** | **0.1743 ms** | **0.1545 ms** |  **1.00** |    **0.01** | **30562.5000** | **30562.5000** | **30562.5000** |   **97017.35 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | True             | False       | True         |   2.608 ms | 0.0035 ms | 0.0031 ms |  0.09 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.002 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | True             | False       | True         |   2.637 ms | 0.0048 ms | 0.0042 ms |  0.09 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.001 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **True**             | **False**       | **True**         |  **29.234 ms** | **0.0751 ms** | **0.0702 ms** |  **1.00** |    **0.00** | **30570.3125** | **30570.3125** | **30570.3125** |   **97017.35 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | True             | False       | True         |   2.638 ms | 0.0113 ms | 0.0094 ms |  0.09 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.002 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | True             | False       | True         |   2.652 ms | 0.0153 ms | 0.0143 ms |  0.09 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.001 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **True**             | **True**        | **False**        |  **19.381 ms** | **0.2295 ms** | **0.2147 ms** |  **1.00** |    **0.02** | **21117.1875** | **21117.1875** | **21117.1875** |    **64946.5 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | True             | True        | False        |   2.474 ms | 0.0064 ms | 0.0060 ms |  0.13 |    0.00 |     3.9063 |          - |          - |     138.63 KB |       0.002 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | True             | True        | False        |   2.576 ms | 0.0050 ms | 0.0039 ms |  0.13 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.002 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **True**             | **True**        | **False**        |  **19.576 ms** | **0.1850 ms** | **0.1730 ms** |  **1.00** |    **0.01** | **21117.1875** | **21117.1875** | **21117.1875** |    **64946.5 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | True             | True        | False        |   2.485 ms | 0.0059 ms | 0.0053 ms |  0.13 |    0.00 |     3.9063 |          - |          - |     138.63 KB |       0.002 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | True             | True        | False        |   2.611 ms | 0.0140 ms | 0.0131 ms |  0.13 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.002 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **True**             | **True**        | **True**         |  **28.931 ms** | **0.1083 ms** | **0.0905 ms** |  **1.00** |    **0.00** | **30570.3125** | **30570.3125** | **30570.3125** |   **97017.35 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | True             | True        | True         |   3.998 ms | 0.0235 ms | 0.0183 ms |  0.14 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.002 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | True             | True        | True         |   3.905 ms | 0.0352 ms | 0.0330 ms |  0.13 |    0.00 |          - |          - |          - |      142.6 KB |       0.001 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **131072**    | **True**             | **True**        | **True**         |  **29.235 ms** | **0.1160 ms** | **0.1085 ms** |  **1.00** |    **0.01** | **30570.3125** | **30570.3125** | **30570.3125** |   **97017.35 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 131072    | True             | True        | True         |   4.022 ms | 0.0174 ms | 0.0163 ms |  0.14 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.002 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 131072    | True             | True        | True         |   3.934 ms | 0.0185 ms | 0.0173 ms |  0.13 |    0.00 |          - |          - |          - |      142.6 KB |       0.001 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **False**            | **False**       | **False**        |  **12.800 ms** | **0.2433 ms** | **0.2157 ms** |  **1.00** |    **0.02** | **30718.7500** | **30718.7500** | **30718.7500** |  **149787.63 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | False            | False       | False        |   6.170 ms | 0.0162 ms | 0.0152 ms |  0.48 |    0.01 |          - |          - |          - |      90.19 KB |       0.001 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | False            | False       | False        |   5.700 ms | 0.0080 ms | 0.0074 ms |  0.45 |    0.01 |          - |          - |          - |      43.88 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **False**            | **False**       | **False**        |  **12.856 ms** | **0.1624 ms** | **0.1519 ms** |  **1.00** |    **0.02** | **30687.5000** | **30687.5000** | **30687.5000** |  **149787.62 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | False            | False       | False        |   6.295 ms | 0.0424 ms | 0.0396 ms |  0.49 |    0.01 |          - |          - |          - |      90.19 KB |       0.001 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | False            | False       | False        |   5.829 ms | 0.0360 ms | 0.0336 ms |  0.45 |    0.01 |          - |          - |          - |      43.88 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **False**            | **False**       | **True**         |  **16.626 ms** | **0.3234 ms** | **0.2701 ms** |  **1.00** |    **0.02** | **30781.2500** | **30781.2500** | **30781.2500** |  **152807.48 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | False            | False       | True         |   6.319 ms | 0.0186 ms | 0.0165 ms |  0.38 |    0.01 |          - |          - |          - |      90.19 KB |       0.001 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | False            | False       | True         |   5.913 ms | 0.0103 ms | 0.0096 ms |  0.36 |    0.01 |          - |          - |          - |      43.88 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **False**            | **False**       | **True**         |  **16.732 ms** | **0.1822 ms** | **0.1615 ms** |  **1.00** |    **0.01** | **31093.7500** | **31093.7500** | **31093.7500** |  **152806.39 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | False            | False       | True         |   6.400 ms | 0.0433 ms | 0.0405 ms |  0.38 |    0.00 |          - |          - |          - |      90.19 KB |       0.001 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | False            | False       | True         |   5.942 ms | 0.0263 ms | 0.0246 ms |  0.36 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **False**            | **True**        | **False**        |  **12.759 ms** | **0.2173 ms** | **0.1926 ms** |  **1.00** |    **0.02** | **30843.7500** | **30843.7500** | **30843.7500** |  **149787.47 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | False            | True        | False        |   7.463 ms | 0.0118 ms | 0.0110 ms |  0.59 |    0.01 |          - |          - |          - |      90.19 KB |       0.001 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | False            | True        | False        |   7.225 ms | 0.0116 ms | 0.0097 ms |  0.57 |    0.01 |          - |          - |          - |      43.88 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **False**            | **True**        | **False**        |  **12.939 ms** | **0.2225 ms** | **0.2081 ms** |  **1.00** |    **0.02** | **30968.7500** | **30968.7500** | **30968.7500** |  **149785.54 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | False            | True        | False        |   7.629 ms | 0.0580 ms | 0.0542 ms |  0.59 |    0.01 |          - |          - |          - |      90.19 KB |       0.001 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | False            | True        | False        |   7.261 ms | 0.0326 ms | 0.0305 ms |  0.56 |    0.01 |          - |          - |          - |      43.88 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **False**            | **True**        | **True**         |  **16.649 ms** | **0.1430 ms** | **0.1195 ms** |  **1.00** |    **0.01** | **30781.2500** | **30781.2500** | **30781.2500** |  **152808.49 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | False            | True        | True         |   7.591 ms | 0.0107 ms | 0.0089 ms |  0.46 |    0.00 |          - |          - |          - |      90.19 KB |       0.001 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | False            | True        | True         |   7.545 ms | 0.0178 ms | 0.0157 ms |  0.45 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **False**            | **True**        | **True**         |  **16.863 ms** | **0.2771 ms** | **0.2592 ms** |  **1.00** |    **0.02** | **31000.0000** | **31000.0000** | **31000.0000** |  **152808.33 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | False            | True        | True         |   7.669 ms | 0.0231 ms | 0.0205 ms |  0.45 |    0.01 |          - |          - |          - |      90.19 KB |       0.001 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | False            | True        | True         |   7.549 ms | 0.0179 ms | 0.0159 ms |  0.45 |    0.01 |          - |          - |          - |      43.88 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **True**             | **False**       | **False**        |  **12.808 ms** | **0.2199 ms** | **0.2057 ms** |  **1.00** |    **0.02** | **30781.2500** | **30781.2500** | **30781.2500** |  **149786.05 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | True             | False       | False        |   6.187 ms | 0.0233 ms | 0.0194 ms |  0.48 |    0.01 |          - |          - |          - |       84.1 KB |       0.001 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | True             | False       | False        |   5.721 ms | 0.0321 ms | 0.0285 ms |  0.45 |    0.01 |          - |          - |          - |      43.88 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **True**             | **False**       | **False**        |  **12.798 ms** | **0.1528 ms** | **0.1354 ms** |  **1.00** |    **0.01** | **31093.7500** | **31093.7500** | **31093.7500** |  **149783.88 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | True             | False       | False        |   6.159 ms | 0.0271 ms | 0.0254 ms |  0.48 |    0.01 |          - |          - |          - |       84.1 KB |       0.001 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | True             | False       | False        |   5.717 ms | 0.0297 ms | 0.0278 ms |  0.45 |    0.01 |          - |          - |          - |      43.88 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **True**             | **False**       | **True**         |  **16.645 ms** | **0.2065 ms** | **0.1932 ms** |  **1.00** |    **0.02** | **30781.2500** | **30781.2500** | **30781.2500** |  **152808.88 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | True             | False       | True         |   6.341 ms | 0.0359 ms | 0.0318 ms |  0.38 |    0.00 |          - |          - |          - |       84.1 KB |       0.001 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | True             | False       | True         |   5.928 ms | 0.0211 ms | 0.0176 ms |  0.36 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **True**             | **False**       | **True**         |  **16.770 ms** | **0.2249 ms** | **0.1994 ms** |  **1.00** |    **0.02** | **31000.0000** | **31000.0000** | **31000.0000** |  **152808.95 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | True             | False       | True         |   6.303 ms | 0.0200 ms | 0.0187 ms |  0.38 |    0.00 |          - |          - |          - |      84.09 KB |       0.001 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | True             | False       | True         |   5.892 ms | 0.0306 ms | 0.0271 ms |  0.35 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **True**             | **True**        | **False**        |  **12.762 ms** | **0.2309 ms** | **0.2160 ms** |  **1.00** |    **0.02** | **31000.0000** | **31000.0000** | **31000.0000** |  **149784.38 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | True             | True        | False        |   7.524 ms | 0.0501 ms | 0.0418 ms |  0.59 |    0.01 |          - |          - |          - |      84.09 KB |       0.001 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | True             | True        | False        |   7.200 ms | 0.0196 ms | 0.0183 ms |  0.56 |    0.01 |          - |          - |          - |      43.88 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **True**             | **True**        | **False**        |  **12.833 ms** | **0.1703 ms** | **0.1593 ms** |  **1.00** |    **0.02** | **30906.2500** | **30906.2500** | **30906.2500** |  **149785.61 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | True             | True        | False        |   7.533 ms | 0.0313 ms | 0.0293 ms |  0.59 |    0.01 |          - |          - |          - |       84.1 KB |       0.001 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | True             | True        | False        |   7.332 ms | 0.0757 ms | 0.0708 ms |  0.57 |    0.01 |          - |          - |          - |      43.88 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **True**             | **True**        | **True**         |  **16.597 ms** | **0.1561 ms** | **0.1384 ms** |  **1.00** |    **0.01** | **30906.2500** | **30906.2500** | **30906.2500** |  **152808.88 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | True             | True        | True         |   7.593 ms | 0.0404 ms | 0.0358 ms |  0.46 |    0.00 |          - |          - |          - |       84.1 KB |       0.001 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | True             | True        | True         |   7.501 ms | 0.0118 ms | 0.0111 ms |  0.45 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **983040**    | **True**             | **True**        | **True**         |  **16.737 ms** | **0.1522 ms** | **0.1424 ms** |  **1.00** |    **0.01** | **30843.7500** | **30843.7500** | **30843.7500** |   **152809.1 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 983040    | True             | True        | True         |   7.869 ms | 0.1272 ms | 0.1306 ms |  0.47 |    0.01 |          - |          - |          - |       84.1 KB |       0.001 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 983040    | True             | True        | True         |   7.700 ms | 0.0430 ms | 0.0402 ms |  0.46 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **False**            | **False**       | **False**        |  **66.994 ms** | **0.6295 ms** | **0.5581 ms** |  **1.00** |    **0.01** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475140.96 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | False            | False       | False        |  49.345 ms | 0.2427 ms | 0.2152 ms |  0.74 |    0.01 |          - |          - |          - |     152.96 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | False            | False       | False        |  37.581 ms | 0.5139 ms | 0.4807 ms |  0.56 |    0.01 |          - |          - |          - |       8.18 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **False**            | **False**       | **False**        |  **67.905 ms** | **1.0653 ms** | **0.9965 ms** |  **1.00** |    **0.02** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475139.96 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | False            | False       | False        |  50.067 ms | 0.2775 ms | 0.2318 ms |  0.74 |    0.01 |          - |          - |          - |     152.94 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | False            | False       | False        |  38.029 ms | 0.1908 ms | 0.1691 ms |  0.56 |    0.01 |          - |          - |          - |       8.18 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **False**            | **False**       | **True**         |  **66.734 ms** | **0.6351 ms** | **0.5303 ms** |  **1.00** |    **0.01** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475241.46 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | False            | False       | True         |  49.201 ms | 0.3796 ms | 0.3365 ms |  0.74 |    0.01 |          - |          - |          - |     153.84 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | False            | False       | True         |  37.140 ms | 0.4264 ms | 0.3989 ms |  0.56 |    0.01 |          - |          - |          - |       8.18 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **False**            | **False**       | **True**         |  **68.023 ms** | **0.7208 ms** | **0.6742 ms** |  **1.00** |    **0.01** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475241.46 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | False            | False       | True         |  49.615 ms | 0.2616 ms | 0.2185 ms |  0.73 |    0.01 |          - |          - |          - |     153.84 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | False            | False       | True         |  38.742 ms | 0.5025 ms | 0.4700 ms |  0.57 |    0.01 |          - |          - |          - |       8.16 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **False**            | **True**        | **False**        |  **67.246 ms** | **0.5191 ms** | **0.4856 ms** |  **1.00** |    **0.01** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475139.96 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | False            | True        | False        |  53.962 ms | 0.4403 ms | 0.4118 ms |  0.80 |    0.01 |          - |          - |          - |     152.97 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | False            | True        | False        |  52.952 ms | 0.6558 ms | 0.5476 ms |  0.79 |    0.01 |          - |          - |          - |        8.2 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **False**            | **True**        | **False**        |  **67.503 ms** | **0.5250 ms** | **0.4911 ms** |  **1.00** |    **0.01** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475139.96 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | False            | True        | False        |  54.978 ms | 0.3712 ms | 0.3472 ms |  0.81 |    0.01 |          - |          - |          - |     152.97 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | False            | True        | False        |  55.342 ms | 0.6950 ms | 0.6501 ms |  0.82 |    0.01 |          - |          - |          - |        8.2 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **False**            | **True**        | **True**         |  **67.552 ms** | **0.7285 ms** | **0.6815 ms** |  **1.00** |    **0.01** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475241.46 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | False            | True        | True         |  55.008 ms | 0.6342 ms | 0.5933 ms |  0.81 |    0.01 |          - |          - |          - |     153.84 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | False            | True        | True         |  53.826 ms | 0.8542 ms | 0.7990 ms |  0.80 |    0.01 |          - |          - |          - |        8.2 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **False**            | **True**        | **True**         |  **67.141 ms** | **0.7187 ms** | **0.6723 ms** |  **1.00** |    **0.01** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475242.46 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | False            | True        | True         |  55.238 ms | 0.4083 ms | 0.3620 ms |  0.82 |    0.01 |          - |          - |          - |     153.81 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | False            | True        | True         |  55.611 ms | 0.6153 ms | 0.5455 ms |  0.83 |    0.01 |          - |          - |          - |        8.2 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **True**             | **False**       | **False**        |  **66.950 ms** | **0.7455 ms** | **0.6973 ms** |  **1.00** |    **0.01** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475139.96 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | True             | False       | False        |  49.341 ms | 0.3551 ms | 0.3321 ms |  0.74 |    0.01 |          - |          - |          - |     151.83 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | True             | False       | False        |  37.999 ms | 0.7469 ms | 0.6987 ms |  0.57 |    0.01 |          - |          - |          - |       8.19 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **True**             | **False**       | **False**        |  **67.356 ms** | **0.9105 ms** | **0.8516 ms** |  **1.00** |    **0.02** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475139.96 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | True             | False       | False        |  49.675 ms | 0.2585 ms | 0.2291 ms |  0.74 |    0.01 |          - |          - |          - |     151.84 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | True             | False       | False        |  38.757 ms | 0.5684 ms | 0.5316 ms |  0.58 |    0.01 |          - |          - |          - |       8.18 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **True**             | **False**       | **True**         |  **66.675 ms** | **0.6194 ms** | **0.5794 ms** |  **1.00** |    **0.01** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475241.46 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | True             | False       | True         |  48.998 ms | 0.3044 ms | 0.2847 ms |  0.73 |    0.01 |          - |          - |          - |     152.71 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | True             | False       | True         |  37.840 ms | 0.7004 ms | 0.6552 ms |  0.57 |    0.01 |          - |          - |          - |       8.18 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **True**             | **False**       | **True**         |  **67.781 ms** | **0.8108 ms** | **0.7584 ms** |  **1.00** |    **0.02** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475241.46 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | True             | False       | True         |  50.011 ms | 0.3139 ms | 0.2783 ms |  0.74 |    0.01 |          - |          - |          - |     152.71 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | True             | False       | True         |  38.277 ms | 0.3770 ms | 0.3342 ms |  0.56 |    0.01 |          - |          - |          - |       8.19 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **True**             | **True**        | **False**        |  **67.584 ms** | **0.7538 ms** | **0.7051 ms** |  **1.00** |    **0.01** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475141.47 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | True             | True        | False        |  54.102 ms | 0.4717 ms | 0.4182 ms |  0.80 |    0.01 |          - |          - |          - |     151.84 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | True             | True        | False        |  53.843 ms | 0.8537 ms | 0.7985 ms |  0.80 |    0.01 |          - |          - |          - |        8.2 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **True**             | **True**        | **False**        |  **68.033 ms** | **0.3997 ms** | **0.3543 ms** |  **1.00** |    **0.01** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475139.96 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | True             | True        | False        |  55.594 ms | 0.6115 ms | 0.5720 ms |  0.82 |    0.01 |          - |          - |          - |     151.84 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | True             | True        | False        |  54.920 ms | 0.5788 ms | 0.4833 ms |  0.81 |    0.01 |          - |          - |          - |        8.2 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **True**             | **True**        | **True**         |  **67.428 ms** | **0.5665 ms** | **0.5299 ms** |  **1.00** |    **0.01** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475241.46 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | True             | True        | True         |  53.925 ms | 0.1612 ms | 0.1346 ms |  0.80 |    0.01 |          - |          - |          - |     152.71 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | True             | True        | True         |  53.540 ms | 0.9408 ms | 1.2234 ms |  0.79 |    0.02 |          - |          - |          - |        8.2 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **16777216**  | **True**             | **True**        | **True**         |  **67.402 ms** | **0.5253 ms** | **0.4913 ms** |  **1.00** |    **0.01** |  **4500.0000** |  **4500.0000** |  **4500.0000** |  **475241.46 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 16777216  | True             | True        | True         |  55.603 ms | 0.2762 ms | 0.2584 ms |  0.82 |    0.01 |          - |          - |          - |     152.71 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 16777216  | True             | True        | True         |  55.607 ms | 0.8436 ms | 0.7891 ms |  0.83 |    0.01 |          - |          - |          - |        8.2 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **False**            | **False**       | **False**        | **161.244 ms** | **1.8637 ms** | **1.7433 ms** |  **1.00** |    **0.01** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982401.43 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | False            | False       | False        | 144.372 ms | 0.5925 ms | 0.5542 ms |  0.90 |    0.01 |          - |          - |          - |     302.75 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | False            | False       | False        | 102.906 ms | 2.0232 ms | 2.1649 ms |  0.64 |    0.01 |          - |          - |          - |       2.89 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **False**            | **False**       | **False**        | **161.591 ms** | **0.9670 ms** | **0.8572 ms** |  **1.00** |    **0.01** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982401.43 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | False            | False       | False        | 145.533 ms | 0.4267 ms | 0.3783 ms |  0.90 |    0.01 |          - |          - |          - |     302.67 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | False            | False       | False        | 106.953 ms | 1.2315 ms | 1.1519 ms |  0.66 |    0.01 |          - |          - |          - |       2.89 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **False**            | **False**       | **True**         | **161.269 ms** | **1.3852 ms** | **1.2280 ms** |  **1.00** |    **0.01** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982412.68 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | False            | False       | True         | 144.165 ms | 0.8235 ms | 0.7703 ms |  0.89 |    0.01 |          - |          - |          - |     302.67 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | False            | False       | True         | 102.724 ms | 1.9777 ms | 2.1161 ms |  0.64 |    0.01 |          - |          - |          - |       2.89 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **False**            | **False**       | **True**         | **165.246 ms** | **0.9796 ms** | **0.8684 ms** |  **1.00** |    **0.01** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982412.68 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | False            | False       | True         | 145.689 ms | 0.2596 ms | 0.2168 ms |  0.88 |    0.00 |          - |          - |          - |     302.75 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | False            | False       | True         | 104.584 ms | 1.4235 ms | 1.3315 ms |  0.63 |    0.01 |          - |          - |          - |       2.89 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **False**            | **True**        | **False**        | **160.797 ms** | **1.5147 ms** | **1.4168 ms** |  **1.00** |    **0.01** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982401.43 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | False            | True        | False        | 191.131 ms | 1.3106 ms | 1.1619 ms |  1.19 |    0.01 |          - |          - |          - |     302.79 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | False            | True        | False        | 155.881 ms | 2.5994 ms | 2.4315 ms |  0.97 |    0.02 |          - |          - |          - |       2.91 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **False**            | **True**        | **False**        | **164.530 ms** | **1.8653 ms** | **1.6536 ms** |  **1.00** |    **0.01** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982401.43 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | False            | True        | False        | 193.386 ms | 0.9516 ms | 0.8901 ms |  1.18 |    0.01 |          - |          - |          - |     302.79 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | False            | True        | False        | 155.647 ms | 0.7430 ms | 0.6950 ms |  0.95 |    0.01 |          - |          - |          - |       2.91 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **False**            | **True**        | **True**         | **163.447 ms** | **1.5839 ms** | **1.4041 ms** |  **1.00** |    **0.01** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982412.68 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | False            | True        | True         | 192.179 ms | 0.8277 ms | 0.7742 ms |  1.18 |    0.01 |          - |          - |          - |     302.68 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | False            | True        | True         | 154.688 ms | 2.1031 ms | 1.9672 ms |  0.95 |    0.01 |          - |          - |          - |       2.91 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **False**            | **True**        | **True**         | **163.254 ms** | **1.6162 ms** | **1.4327 ms** |  **1.00** |    **0.01** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982412.68 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | False            | True        | True         | 193.135 ms | 0.6995 ms | 0.6543 ms |  1.18 |    0.01 |          - |          - |          - |     302.79 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | False            | True        | True         | 156.341 ms | 1.5335 ms | 1.4345 ms |  0.96 |    0.01 |          - |          - |          - |       2.91 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **True**             | **False**       | **False**        | **163.126 ms** | **2.1329 ms** | **1.9952 ms** |  **1.00** |    **0.02** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982401.43 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | True             | False       | False        | 144.456 ms | 0.6246 ms | 0.5843 ms |  0.89 |    0.01 |          - |          - |          - |     302.36 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | True             | False       | False        | 101.120 ms | 0.8354 ms | 0.6976 ms |  0.62 |    0.01 |          - |          - |          - |       2.89 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **True**             | **False**       | **False**        | **162.760 ms** | **0.8492 ms** | **0.7528 ms** |  **1.00** |    **0.01** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982401.43 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | True             | False       | False        | 145.752 ms | 0.4019 ms | 0.3563 ms |  0.90 |    0.00 |          - |          - |          - |     302.36 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | True             | False       | False        | 106.431 ms | 1.2109 ms | 1.1327 ms |  0.65 |    0.01 |          - |          - |          - |       2.89 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **True**             | **False**       | **True**         | **162.365 ms** | **2.2357 ms** | **1.9819 ms** |  **1.00** |    **0.02** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982412.68 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | True             | False       | True         | 144.458 ms | 0.6189 ms | 0.5789 ms |  0.89 |    0.01 |          - |          - |          - |     302.36 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | True             | False       | True         | 103.087 ms | 1.9931 ms | 1.9575 ms |  0.63 |    0.01 |          - |          - |          - |       2.89 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **True**             | **False**       | **True**         | **162.967 ms** | **0.6587 ms** | **0.5839 ms** |  **1.00** |    **0.00** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982412.68 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | True             | False       | True         | 145.334 ms | 0.6485 ms | 0.5749 ms |  0.89 |    0.00 |          - |          - |          - |     302.36 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | True             | False       | True         | 107.006 ms | 1.1573 ms | 1.0825 ms |  0.66 |    0.01 |          - |          - |          - |        5.3 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **True**             | **True**        | **False**        | **161.221 ms** | **2.3266 ms** | **2.1763 ms** |  **1.00** |    **0.02** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982401.36 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | True             | True        | False        | 190.850 ms | 0.9662 ms | 0.9038 ms |  1.18 |    0.02 |          - |          - |          - |      302.4 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | True             | True        | False        | 154.766 ms | 1.9980 ms | 1.8689 ms |  0.96 |    0.02 |          - |          - |          - |       2.91 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **True**             | **True**        | **False**        | **165.372 ms** | **1.3997 ms** | **1.3092 ms** |  **1.00** |    **0.01** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982401.43 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | True             | True        | False        | 193.504 ms | 0.5330 ms | 0.4450 ms |  1.17 |    0.01 |          - |          - |          - |      302.4 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | True             | True        | False        | 156.217 ms | 1.0279 ms | 0.9615 ms |  0.94 |    0.01 |          - |          - |          - |       2.91 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **True**             | **True**        | **True**         | **160.520 ms** | **1.0192 ms** | **0.9035 ms** |  **1.00** |    **0.01** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982412.68 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | True             | True        | True         | 191.002 ms | 1.3263 ms | 1.2406 ms |  1.19 |    0.01 |          - |          - |          - |      302.4 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | True             | True        | True         | 154.484 ms | 2.3485 ms | 2.1968 ms |  0.96 |    0.01 |          - |          - |          - |       2.91 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **100597760** | **True**             | **True**        | **True**         | **165.072 ms** | **1.3058 ms** | **1.1575 ms** |  **1.00** |    **0.01** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **982412.68 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 100597760 | True             | True        | True         | 193.313 ms | 0.9727 ms | 0.9099 ms |  1.17 |    0.01 |          - |          - |          - |      302.4 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 100597760 | True             | True        | True         | 154.430 ms | 0.8261 ms | 0.7727 ms |  0.94 |    0.01 |          - |          - |          - |       2.91 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **False**            | **False**       | **False**        | **202.576 ms** | **2.1753 ms** | **2.0348 ms** |  **1.00** |    **0.01** |   **666.6667** |   **666.6667** |   **666.6667** | **1228800.86 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | False            | False       | False        | 183.088 ms | 0.6134 ms | 0.4789 ms |  0.90 |    0.01 |          - |          - |          - |     376.77 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | False            | False       | False        | 127.956 ms | 0.8639 ms | 0.7214 ms |  0.63 |    0.01 |          - |          - |          - |       1.79 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **False**            | **False**       | **False**        | **205.152 ms** | **3.0991 ms** | **2.8989 ms** |  **1.00** |    **0.02** |   **666.6667** |   **666.6667** |   **666.6667** | **1228800.86 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | False            | False       | False        | 185.234 ms | 0.5516 ms | 0.5160 ms |  0.90 |    0.01 |          - |          - |          - |     376.77 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | False            | False       | False        | 133.399 ms | 2.2872 ms | 2.1394 ms |  0.65 |    0.01 |          - |          - |          - |       1.79 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **False**            | **False**       | **True**         | **205.574 ms** | **1.7250 ms** | **1.4405 ms** |  **1.00** |    **0.01** |  **1000.0000** |  **1000.0000** |  **1000.0000** | **1228804.78 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | False            | False       | True         | 183.497 ms | 0.6284 ms | 0.5878 ms |  0.89 |    0.01 |          - |          - |          - |     376.93 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | False            | False       | True         | 127.594 ms | 0.4628 ms | 0.3865 ms |  0.62 |    0.00 |          - |          - |          - |       1.79 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **False**            | **False**       | **True**         | **209.084 ms** | **2.0739 ms** | **1.9400 ms** |  **1.00** |    **0.01** |  **1000.0000** |  **1000.0000** |  **1000.0000** | **1228804.78 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | False            | False       | True         | 184.856 ms | 0.4621 ms | 0.4323 ms |  0.88 |    0.01 |          - |          - |          - |     376.93 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | False            | False       | True         | 134.795 ms | 1.7589 ms | 1.6453 ms |  0.64 |    0.01 |          - |          - |          - |       1.79 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **False**            | **True**        | **False**        | **202.128 ms** | **2.4423 ms** | **2.2845 ms** |  **1.00** |    **0.02** |   **666.6667** |   **666.6667** |   **666.6667** | **1228800.86 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | False            | True        | False        | 247.489 ms | 1.0245 ms | 0.9583 ms |  1.22 |    0.01 |          - |          - |          - |     376.77 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | False            | True        | False        | 195.657 ms | 2.9652 ms | 2.7736 ms |  0.97 |    0.02 |          - |          - |          - |       1.82 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **False**            | **True**        | **False**        | **206.649 ms** | **2.3928 ms** | **2.2382 ms** |  **1.00** |    **0.01** |   **666.6667** |   **666.6667** |   **666.6667** | **1228800.86 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | False            | True        | False        | 252.866 ms | 4.7036 ms | 4.3998 ms |  1.22 |    0.02 |          - |          - |          - |     376.84 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | False            | True        | False        | 196.956 ms | 1.5280 ms | 1.4293 ms |  0.95 |    0.01 |          - |          - |          - |       1.82 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **False**            | **True**        | **True**         | **206.511 ms** | **2.7791 ms** | **2.5996 ms** |  **1.00** |    **0.02** |  **1000.0000** |  **1000.0000** |  **1000.0000** | **1228804.78 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | False            | True        | True         | 248.057 ms | 0.6826 ms | 0.5700 ms |  1.20 |    0.01 |          - |          - |          - |     376.99 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | False            | True        | True         | 197.924 ms | 3.2985 ms | 3.0854 ms |  0.96 |    0.02 |          - |          - |          - |       1.82 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **False**            | **True**        | **True**         | **211.046 ms** | **2.1582 ms** | **2.0188 ms** |  **1.00** |    **0.01** |  **1000.0000** |  **1000.0000** |  **1000.0000** | **1228804.78 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | False            | True        | True         | 248.802 ms | 0.9233 ms | 0.8637 ms |  1.18 |    0.01 |          - |          - |          - |     376.93 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | False            | True        | True         | 195.758 ms | 1.2749 ms | 1.1925 ms |  0.93 |    0.01 |          - |          - |          - |       1.82 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **True**             | **False**       | **False**        | **203.652 ms** | **2.8582 ms** | **2.6736 ms** |  **1.00** |    **0.02** |   **666.6667** |   **666.6667** |   **666.6667** | **1228800.86 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | True             | False       | False        | 183.499 ms | 0.4145 ms | 0.3674 ms |  0.90 |    0.01 |          - |          - |          - |     376.54 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | True             | False       | False        | 128.176 ms | 0.6691 ms | 0.5588 ms |  0.63 |    0.01 |          - |          - |          - |       1.71 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **True**             | **False**       | **False**        | **205.676 ms** | **1.6540 ms** | **1.5471 ms** |  **1.00** |    **0.01** |   **666.6667** |   **666.6667** |   **666.6667** | **1228800.86 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | True             | False       | False        | 184.778 ms | 0.4067 ms | 0.3396 ms |  0.90 |    0.01 |          - |          - |          - |     376.54 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | True             | False       | False        | 133.798 ms | 1.7622 ms | 1.6484 ms |  0.65 |    0.01 |          - |          - |          - |       1.79 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **True**             | **False**       | **True**         | **208.423 ms** | **3.2501 ms** | **3.0401 ms** |  **1.00** |    **0.02** |  **1000.0000** |  **1000.0000** |  **1000.0000** | **1228804.78 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | True             | False       | True         | 183.166 ms | 0.8096 ms | 0.7573 ms |  0.88 |    0.01 |          - |          - |          - |     376.69 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | True             | False       | True         | 128.692 ms | 1.5612 ms | 1.3840 ms |  0.62 |    0.01 |          - |          - |          - |       1.79 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **True**             | **False**       | **True**         | **206.984 ms** | **1.2716 ms** | **1.0618 ms** |  **1.00** |    **0.01** |  **1000.0000** |  **1000.0000** |  **1000.0000** | **1228804.78 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | True             | False       | True         | 184.937 ms | 0.8308 ms | 0.7771 ms |  0.89 |    0.01 |          - |          - |          - |     376.69 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | True             | False       | True         | 135.548 ms | 1.2355 ms | 1.1557 ms |  0.65 |    0.01 |          - |          - |          - |       1.79 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **True**             | **True**        | **False**        | **202.093 ms** | **2.1392 ms** | **2.0010 ms** |  **1.00** |    **0.01** |   **666.6667** |   **666.6667** |   **666.6667** | **1228800.86 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | True             | True        | False        | 246.968 ms | 1.6034 ms | 1.4999 ms |  1.22 |    0.01 |          - |          - |          - |     376.46 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | True             | True        | False        | 195.163 ms | 3.0959 ms | 2.8959 ms |  0.97 |    0.02 |          - |          - |          - |       1.82 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **True**             | **True**        | **False**        | **207.309 ms** | **1.7605 ms** | **1.6467 ms** |  **1.00** |    **0.01** |   **666.6667** |   **666.6667** |   **666.6667** | **1228800.86 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | True             | True        | False        | 249.065 ms | 1.4479 ms | 1.3543 ms |  1.20 |    0.01 |          - |          - |          - |      376.6 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | True             | True        | False        | 197.765 ms | 1.6204 ms | 1.5157 ms |  0.95 |    0.01 |          - |          - |          - |       1.82 KB |       0.000 |
 |                                             |           |                  |             |              |            |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **True**             | **True**        | **True**         | **205.956 ms** | **2.8869 ms** | **2.7004 ms** |  **1.00** |    **0.02** |  **1000.0000** |  **1000.0000** |  **1000.0000** | **1228804.78 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | True             | True        | True         | 246.576 ms | 0.8434 ms | 0.7043 ms |  1.20 |    0.02 |          - |          - |          - |     376.69 KB |       0.000 |
-| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | True             | True        | True         | 195.906 ms | 3.5632 ms | 3.3330 ms |  0.95 |    0.02 |          - |          - |          - |       1.82 KB |       0.000 |
+| **&#39;MemoryStream bulk fill and read&#39;**           | **209715200** | **True**             | **True**        | **True**         | **211.886 ms** | **1.8052 ms** | **1.6886 ms** |  **1.00** |    **0.01** |  **1000.0000** |  **1000.0000** |  **1000.0000** | **1228804.78 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream bulk fill and read&#39; | 209715200 | True             | True        | True         | 248.594 ms | 1.0393 ms | 0.9213 ms |  1.17 |    0.01 |          - |          - |          - |     376.76 KB |       0.000 |
+| &#39;MemoryStreamSlim bulk fill and read&#39;       | 209715200 | True             | True        | True         | 194.721 ms | 0.9139 ms | 0.8549 ms |  0.92 |    0.01 |          - |          - |          - |       1.82 KB |       0.000 |
diff --git a/Source/Docs/articles/MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-report.html b/Source/Docs/articles/MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-report.html
index bfa4888..a0dcf49 100644
--- a/Source/Docs/articles/MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-report.html
+++ b/Source/Docs/articles/MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-report.html
@@ -2,7 +2,7 @@
 <html lang='en'>
 <head>
 <meta charset='utf-8' />
-<title>MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-20241011-203156</title>
+<title>MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-20241024-190914</title>
 
 <style type="text/css">
 	table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
@@ -24,126 +24,126 @@
 <table>
 <thead><tr><th>Method                               </th><th>DataSize</th><th>CapacityOnCreate</th><th>ZeroBuffers</th><th>GrowEachLoop</th><th>Mean</th><th>Error</th><th>StdDev</th><th>Ratio</th><th>RatioSD</th><th>Gen0</th><th>Gen1</th><th>Gen2</th><th>Allocated</th><th>Alloc Ratio</th>
 </tr>
-</thead><tbody><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>False</td><td>20.666 ms</td><td>0.1466 ms</td><td>0.1371 ms</td><td>1.00</td><td>0.01</td><td>21117.1875</td><td>21117.1875</td><td>21117.1875</td><td>64946.5 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>False</td><td>1.823 ms</td><td>0.0134 ms</td><td>0.0126 ms</td><td>0.09</td><td>0.00</td><td>5.8594</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>False</td><td>4.368 ms</td><td>0.0232 ms</td><td>0.0217 ms</td><td>0.21</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>142.59 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>True</td><td>29.458 ms</td><td>0.5771 ms</td><td>0.6175 ms</td><td>1.00</td><td>0.03</td><td>30562.5000</td><td>30562.5000</td><td>30562.5000</td><td>97017.35 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>True</td><td>2.618 ms</td><td>0.0078 ms</td><td>0.0069 ms</td><td>0.09</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>True</td><td>2.747 ms</td><td>0.0549 ms</td><td>0.0539 ms</td><td>0.09</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>False</td><td>19.324 ms</td><td>0.1041 ms</td><td>0.0974 ms</td><td>1.00</td><td>0.01</td><td>21117.1875</td><td>21117.1875</td><td>21117.1875</td><td>64946.5 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>False</td><td>2.471 ms</td><td>0.0034 ms</td><td>0.0028 ms</td><td>0.13</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>False</td><td>2.651 ms</td><td>0.0088 ms</td><td>0.0082 ms</td><td>0.14</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>True</td><td>28.971 ms</td><td>0.1455 ms</td><td>0.1361 ms</td><td>1.00</td><td>0.01</td><td>30570.3125</td><td>30570.3125</td><td>30570.3125</td><td>97017.35 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>True</td><td>4.036 ms</td><td>0.0438 ms</td><td>0.0388 ms</td><td>0.14</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>True</td><td>3.996 ms</td><td>0.0440 ms</td><td>0.0412 ms</td><td>0.14</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>False</td><td>19.417 ms</td><td>0.1103 ms</td><td>0.1031 ms</td><td>1.00</td><td>0.01</td><td>21117.1875</td><td>21117.1875</td><td>21117.1875</td><td>64946.5 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>False</td><td>1.801 ms</td><td>0.0042 ms</td><td>0.0040 ms</td><td>0.09</td><td>0.00</td><td>5.8594</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>False</td><td>1.845 ms</td><td>0.0061 ms</td><td>0.0054 ms</td><td>0.10</td><td>0.00</td><td>5.8594</td><td>-</td><td>-</td><td>142.59 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>True</td><td>28.910 ms</td><td>0.1743 ms</td><td>0.1545 ms</td><td>1.00</td><td>0.01</td><td>30562.5000</td><td>30562.5000</td><td>30562.5000</td><td>97017.35 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>True</td><td>2.608 ms</td><td>0.0035 ms</td><td>0.0031 ms</td><td>0.09</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>True</td><td>2.637 ms</td><td>0.0048 ms</td><td>0.0042 ms</td><td>0.09</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>False</td><td>19.381 ms</td><td>0.2295 ms</td><td>0.2147 ms</td><td>1.00</td><td>0.02</td><td>21117.1875</td><td>21117.1875</td><td>21117.1875</td><td>64946.5 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>False</td><td>2.474 ms</td><td>0.0064 ms</td><td>0.0060 ms</td><td>0.13</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>False</td><td>2.576 ms</td><td>0.0050 ms</td><td>0.0039 ms</td><td>0.13</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>True</td><td>28.931 ms</td><td>0.1083 ms</td><td>0.0905 ms</td><td>1.00</td><td>0.00</td><td>30570.3125</td><td>30570.3125</td><td>30570.3125</td><td>97017.35 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>True</td><td>3.998 ms</td><td>0.0235 ms</td><td>0.0183 ms</td><td>0.14</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>True</td><td>3.905 ms</td><td>0.0352 ms</td><td>0.0330 ms</td><td>0.13</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>False</td><td>12.800 ms</td><td>0.2433 ms</td><td>0.2157 ms</td><td>1.00</td><td>0.02</td><td>30718.7500</td><td>30718.7500</td><td>30718.7500</td><td>149787.63 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>False</td><td>6.170 ms</td><td>0.0162 ms</td><td>0.0152 ms</td><td>0.48</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>90.19 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>False</td><td>5.700 ms</td><td>0.0080 ms</td><td>0.0074 ms</td><td>0.45</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>True</td><td>16.626 ms</td><td>0.3234 ms</td><td>0.2701 ms</td><td>1.00</td><td>0.02</td><td>30781.2500</td><td>30781.2500</td><td>30781.2500</td><td>152807.48 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>True</td><td>6.319 ms</td><td>0.0186 ms</td><td>0.0165 ms</td><td>0.38</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>90.19 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>True</td><td>5.913 ms</td><td>0.0103 ms</td><td>0.0096 ms</td><td>0.36</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>False</td><td>12.759 ms</td><td>0.2173 ms</td><td>0.1926 ms</td><td>1.00</td><td>0.02</td><td>30843.7500</td><td>30843.7500</td><td>30843.7500</td><td>149787.47 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>False</td><td>7.463 ms</td><td>0.0118 ms</td><td>0.0110 ms</td><td>0.59</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>90.19 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>False</td><td>7.225 ms</td><td>0.0116 ms</td><td>0.0097 ms</td><td>0.57</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>True</td><td>16.649 ms</td><td>0.1430 ms</td><td>0.1195 ms</td><td>1.00</td><td>0.01</td><td>30781.2500</td><td>30781.2500</td><td>30781.2500</td><td>152808.49 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>True</td><td>7.591 ms</td><td>0.0107 ms</td><td>0.0089 ms</td><td>0.46</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>90.19 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>True</td><td>7.545 ms</td><td>0.0178 ms</td><td>0.0157 ms</td><td>0.45</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>False</td><td>12.808 ms</td><td>0.2199 ms</td><td>0.2057 ms</td><td>1.00</td><td>0.02</td><td>30781.2500</td><td>30781.2500</td><td>30781.2500</td><td>149786.05 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>False</td><td>6.187 ms</td><td>0.0233 ms</td><td>0.0194 ms</td><td>0.48</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>84.1 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>False</td><td>5.721 ms</td><td>0.0321 ms</td><td>0.0285 ms</td><td>0.45</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>True</td><td>16.645 ms</td><td>0.2065 ms</td><td>0.1932 ms</td><td>1.00</td><td>0.02</td><td>30781.2500</td><td>30781.2500</td><td>30781.2500</td><td>152808.88 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>True</td><td>6.341 ms</td><td>0.0359 ms</td><td>0.0318 ms</td><td>0.38</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>84.1 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>True</td><td>5.928 ms</td><td>0.0211 ms</td><td>0.0176 ms</td><td>0.36</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>False</td><td>12.762 ms</td><td>0.2309 ms</td><td>0.2160 ms</td><td>1.00</td><td>0.02</td><td>31000.0000</td><td>31000.0000</td><td>31000.0000</td><td>149784.38 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>False</td><td>7.524 ms</td><td>0.0501 ms</td><td>0.0418 ms</td><td>0.59</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>84.09 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>False</td><td>7.200 ms</td><td>0.0196 ms</td><td>0.0183 ms</td><td>0.56</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>True</td><td>16.597 ms</td><td>0.1561 ms</td><td>0.1384 ms</td><td>1.00</td><td>0.01</td><td>30906.2500</td><td>30906.2500</td><td>30906.2500</td><td>152808.88 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>True</td><td>7.593 ms</td><td>0.0404 ms</td><td>0.0358 ms</td><td>0.46</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>84.1 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>True</td><td>7.501 ms</td><td>0.0118 ms</td><td>0.0111 ms</td><td>0.45</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>False</td><td>66.994 ms</td><td>0.6295 ms</td><td>0.5581 ms</td><td>1.00</td><td>0.01</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475140.96 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>False</td><td>49.345 ms</td><td>0.2427 ms</td><td>0.2152 ms</td><td>0.74</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>152.96 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>False</td><td>37.581 ms</td><td>0.5139 ms</td><td>0.4807 ms</td><td>0.56</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.18 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>True</td><td>66.734 ms</td><td>0.6351 ms</td><td>0.5303 ms</td><td>1.00</td><td>0.01</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475241.46 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>True</td><td>49.201 ms</td><td>0.3796 ms</td><td>0.3365 ms</td><td>0.74</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>153.84 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>True</td><td>37.140 ms</td><td>0.4264 ms</td><td>0.3989 ms</td><td>0.56</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.18 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>False</td><td>67.246 ms</td><td>0.5191 ms</td><td>0.4856 ms</td><td>1.00</td><td>0.01</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475139.96 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>False</td><td>53.962 ms</td><td>0.4403 ms</td><td>0.4118 ms</td><td>0.80</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>152.97 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>False</td><td>52.952 ms</td><td>0.6558 ms</td><td>0.5476 ms</td><td>0.79</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.2 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>True</td><td>67.552 ms</td><td>0.7285 ms</td><td>0.6815 ms</td><td>1.00</td><td>0.01</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475241.46 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>True</td><td>55.008 ms</td><td>0.6342 ms</td><td>0.5933 ms</td><td>0.81</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>153.84 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>True</td><td>53.826 ms</td><td>0.8542 ms</td><td>0.7990 ms</td><td>0.80</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.2 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>False</td><td>66.950 ms</td><td>0.7455 ms</td><td>0.6973 ms</td><td>1.00</td><td>0.01</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475139.96 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>False</td><td>49.341 ms</td><td>0.3551 ms</td><td>0.3321 ms</td><td>0.74</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>151.83 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>False</td><td>37.999 ms</td><td>0.7469 ms</td><td>0.6987 ms</td><td>0.57</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.19 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>True</td><td>66.675 ms</td><td>0.6194 ms</td><td>0.5794 ms</td><td>1.00</td><td>0.01</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475241.46 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>True</td><td>48.998 ms</td><td>0.3044 ms</td><td>0.2847 ms</td><td>0.73</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>152.71 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>True</td><td>37.840 ms</td><td>0.7004 ms</td><td>0.6552 ms</td><td>0.57</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.18 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>False</td><td>67.584 ms</td><td>0.7538 ms</td><td>0.7051 ms</td><td>1.00</td><td>0.01</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475141.47 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>False</td><td>54.102 ms</td><td>0.4717 ms</td><td>0.4182 ms</td><td>0.80</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>151.84 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>False</td><td>53.843 ms</td><td>0.8537 ms</td><td>0.7985 ms</td><td>0.80</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.2 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>True</td><td>67.428 ms</td><td>0.5665 ms</td><td>0.5299 ms</td><td>1.00</td><td>0.01</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475241.46 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>True</td><td>53.925 ms</td><td>0.1612 ms</td><td>0.1346 ms</td><td>0.80</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>152.71 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>True</td><td>53.540 ms</td><td>0.9408 ms</td><td>1.2234 ms</td><td>0.79</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>8.2 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>False</td><td>161.244 ms</td><td>1.8637 ms</td><td>1.7433 ms</td><td>1.00</td><td>0.01</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982401.43 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>False</td><td>144.372 ms</td><td>0.5925 ms</td><td>0.5542 ms</td><td>0.90</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>302.75 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>False</td><td>102.906 ms</td><td>2.0232 ms</td><td>2.1649 ms</td><td>0.64</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.89 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>True</td><td>161.269 ms</td><td>1.3852 ms</td><td>1.2280 ms</td><td>1.00</td><td>0.01</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982412.68 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>True</td><td>144.165 ms</td><td>0.8235 ms</td><td>0.7703 ms</td><td>0.89</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>302.67 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>True</td><td>102.724 ms</td><td>1.9777 ms</td><td>2.1161 ms</td><td>0.64</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.89 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>False</td><td>160.797 ms</td><td>1.5147 ms</td><td>1.4168 ms</td><td>1.00</td><td>0.01</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982401.43 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>False</td><td>191.131 ms</td><td>1.3106 ms</td><td>1.1619 ms</td><td>1.19</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>302.79 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>False</td><td>155.881 ms</td><td>2.5994 ms</td><td>2.4315 ms</td><td>0.97</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>True</td><td>163.447 ms</td><td>1.5839 ms</td><td>1.4041 ms</td><td>1.00</td><td>0.01</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982412.68 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>True</td><td>192.179 ms</td><td>0.8277 ms</td><td>0.7742 ms</td><td>1.18</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>302.68 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>True</td><td>154.688 ms</td><td>2.1031 ms</td><td>1.9672 ms</td><td>0.95</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>False</td><td>163.126 ms</td><td>2.1329 ms</td><td>1.9952 ms</td><td>1.00</td><td>0.02</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982401.43 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>False</td><td>144.456 ms</td><td>0.6246 ms</td><td>0.5843 ms</td><td>0.89</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>302.36 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>False</td><td>101.120 ms</td><td>0.8354 ms</td><td>0.6976 ms</td><td>0.62</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.89 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>True</td><td>162.365 ms</td><td>2.2357 ms</td><td>1.9819 ms</td><td>1.00</td><td>0.02</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982412.68 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>True</td><td>144.458 ms</td><td>0.6189 ms</td><td>0.5789 ms</td><td>0.89</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>302.36 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>True</td><td>103.087 ms</td><td>1.9931 ms</td><td>1.9575 ms</td><td>0.63</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.89 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>False</td><td>161.221 ms</td><td>2.3266 ms</td><td>2.1763 ms</td><td>1.00</td><td>0.02</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982401.36 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>False</td><td>190.850 ms</td><td>0.9662 ms</td><td>0.9038 ms</td><td>1.18</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>302.4 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>False</td><td>154.766 ms</td><td>1.9980 ms</td><td>1.8689 ms</td><td>0.96</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>True</td><td>160.520 ms</td><td>1.0192 ms</td><td>0.9035 ms</td><td>1.00</td><td>0.01</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982412.68 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>True</td><td>191.002 ms</td><td>1.3263 ms</td><td>1.2406 ms</td><td>1.19</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>302.4 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>True</td><td>154.484 ms</td><td>2.3485 ms</td><td>2.1968 ms</td><td>0.96</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>False</td><td>202.576 ms</td><td>2.1753 ms</td><td>2.0348 ms</td><td>1.00</td><td>0.01</td><td>666.6667</td><td>666.6667</td><td>666.6667</td><td>1228800.86 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>False</td><td>183.088 ms</td><td>0.6134 ms</td><td>0.4789 ms</td><td>0.90</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.77 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>False</td><td>127.956 ms</td><td>0.8639 ms</td><td>0.7214 ms</td><td>0.63</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.79 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>True</td><td>205.574 ms</td><td>1.7250 ms</td><td>1.4405 ms</td><td>1.00</td><td>0.01</td><td>1000.0000</td><td>1000.0000</td><td>1000.0000</td><td>1228804.78 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>True</td><td>183.497 ms</td><td>0.6284 ms</td><td>0.5878 ms</td><td>0.89</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.93 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>True</td><td>127.594 ms</td><td>0.4628 ms</td><td>0.3865 ms</td><td>0.62</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>1.79 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>False</td><td>202.128 ms</td><td>2.4423 ms</td><td>2.2845 ms</td><td>1.00</td><td>0.02</td><td>666.6667</td><td>666.6667</td><td>666.6667</td><td>1228800.86 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>False</td><td>247.489 ms</td><td>1.0245 ms</td><td>0.9583 ms</td><td>1.22</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.77 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>False</td><td>195.657 ms</td><td>2.9652 ms</td><td>2.7736 ms</td><td>0.97</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>1.82 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>True</td><td>206.511 ms</td><td>2.7791 ms</td><td>2.5996 ms</td><td>1.00</td><td>0.02</td><td>1000.0000</td><td>1000.0000</td><td>1000.0000</td><td>1228804.78 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>True</td><td>248.057 ms</td><td>0.6826 ms</td><td>0.5700 ms</td><td>1.20</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.99 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>True</td><td>197.924 ms</td><td>3.2985 ms</td><td>3.0854 ms</td><td>0.96</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>1.82 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>False</td><td>203.652 ms</td><td>2.8582 ms</td><td>2.6736 ms</td><td>1.00</td><td>0.02</td><td>666.6667</td><td>666.6667</td><td>666.6667</td><td>1228800.86 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>False</td><td>183.499 ms</td><td>0.4145 ms</td><td>0.3674 ms</td><td>0.90</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.54 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>False</td><td>128.176 ms</td><td>0.6691 ms</td><td>0.5588 ms</td><td>0.63</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.71 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>True</td><td>208.423 ms</td><td>3.2501 ms</td><td>3.0401 ms</td><td>1.00</td><td>0.02</td><td>1000.0000</td><td>1000.0000</td><td>1000.0000</td><td>1228804.78 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>True</td><td>183.166 ms</td><td>0.8096 ms</td><td>0.7573 ms</td><td>0.88</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.69 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>True</td><td>128.692 ms</td><td>1.5612 ms</td><td>1.3840 ms</td><td>0.62</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.79 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>False</td><td>202.093 ms</td><td>2.1392 ms</td><td>2.0010 ms</td><td>1.00</td><td>0.01</td><td>666.6667</td><td>666.6667</td><td>666.6667</td><td>1228800.86 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>False</td><td>246.968 ms</td><td>1.6034 ms</td><td>1.4999 ms</td><td>1.22</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.46 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>False</td><td>195.163 ms</td><td>3.0959 ms</td><td>2.8959 ms</td><td>0.97</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>1.82 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>True</td><td>205.956 ms</td><td>2.8869 ms</td><td>2.7004 ms</td><td>1.00</td><td>0.02</td><td>1000.0000</td><td>1000.0000</td><td>1000.0000</td><td>1228804.78 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>True</td><td>246.576 ms</td><td>0.8434 ms</td><td>0.7043 ms</td><td>1.20</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>376.69 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>True</td><td>195.906 ms</td><td>3.5632 ms</td><td>3.3330 ms</td><td>0.95</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>1.82 KB</td><td>0.000</td>
+</thead><tbody><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>False</td><td>20.441 ms</td><td>0.1538 ms</td><td>0.1285 ms</td><td>1.00</td><td>0.01</td><td>21117.1875</td><td>21117.1875</td><td>21117.1875</td><td>64946.5 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>False</td><td>1.807 ms</td><td>0.0069 ms</td><td>0.0065 ms</td><td>0.09</td><td>0.00</td><td>5.8594</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>False</td><td>1.853 ms</td><td>0.0052 ms</td><td>0.0046 ms</td><td>0.09</td><td>0.00</td><td>5.8594</td><td>-</td><td>-</td><td>142.59 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>True</td><td>29.188 ms</td><td>0.1181 ms</td><td>0.1047 ms</td><td>1.00</td><td>0.00</td><td>30570.3125</td><td>30570.3125</td><td>30570.3125</td><td>97017.35 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>True</td><td>2.649 ms</td><td>0.0070 ms</td><td>0.0062 ms</td><td>0.09</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>True</td><td>2.685 ms</td><td>0.0124 ms</td><td>0.0110 ms</td><td>0.09</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.59 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>False</td><td>19.586 ms</td><td>0.0917 ms</td><td>0.0858 ms</td><td>1.00</td><td>0.01</td><td>21117.1875</td><td>21117.1875</td><td>21117.1875</td><td>64946.5 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>False</td><td>2.500 ms</td><td>0.0092 ms</td><td>0.0086 ms</td><td>0.13</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>False</td><td>2.614 ms</td><td>0.0124 ms</td><td>0.0110 ms</td><td>0.13</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>True</td><td>29.344 ms</td><td>0.1182 ms</td><td>0.0987 ms</td><td>1.00</td><td>0.00</td><td>30562.5000</td><td>30562.5000</td><td>30562.5000</td><td>97017.35 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>True</td><td>3.993 ms</td><td>0.0145 ms</td><td>0.0136 ms</td><td>0.14</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>True</td><td>3.911 ms</td><td>0.0188 ms</td><td>0.0176 ms</td><td>0.13</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>False</td><td>19.508 ms</td><td>0.0663 ms</td><td>0.0621 ms</td><td>1.00</td><td>0.00</td><td>21117.1875</td><td>21117.1875</td><td>21117.1875</td><td>64946.5 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>False</td><td>1.805 ms</td><td>0.0039 ms</td><td>0.0036 ms</td><td>0.09</td><td>0.00</td><td>5.8594</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>False</td><td>1.855 ms</td><td>0.0066 ms</td><td>0.0062 ms</td><td>0.10</td><td>0.00</td><td>5.8594</td><td>-</td><td>-</td><td>142.59 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>True</td><td>29.234 ms</td><td>0.0751 ms</td><td>0.0702 ms</td><td>1.00</td><td>0.00</td><td>30570.3125</td><td>30570.3125</td><td>30570.3125</td><td>97017.35 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>True</td><td>2.638 ms</td><td>0.0113 ms</td><td>0.0094 ms</td><td>0.09</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>True</td><td>2.652 ms</td><td>0.0153 ms</td><td>0.0143 ms</td><td>0.09</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>False</td><td>19.576 ms</td><td>0.1850 ms</td><td>0.1730 ms</td><td>1.00</td><td>0.01</td><td>21117.1875</td><td>21117.1875</td><td>21117.1875</td><td>64946.5 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>False</td><td>2.485 ms</td><td>0.0059 ms</td><td>0.0053 ms</td><td>0.13</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>False</td><td>2.611 ms</td><td>0.0140 ms</td><td>0.0131 ms</td><td>0.13</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>True</td><td>29.235 ms</td><td>0.1160 ms</td><td>0.1085 ms</td><td>1.00</td><td>0.01</td><td>30570.3125</td><td>30570.3125</td><td>30570.3125</td><td>97017.35 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>True</td><td>4.022 ms</td><td>0.0174 ms</td><td>0.0163 ms</td><td>0.14</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>True</td><td>3.934 ms</td><td>0.0185 ms</td><td>0.0173 ms</td><td>0.13</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>False</td><td>12.856 ms</td><td>0.1624 ms</td><td>0.1519 ms</td><td>1.00</td><td>0.02</td><td>30687.5000</td><td>30687.5000</td><td>30687.5000</td><td>149787.62 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>False</td><td>6.295 ms</td><td>0.0424 ms</td><td>0.0396 ms</td><td>0.49</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>90.19 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>False</td><td>5.829 ms</td><td>0.0360 ms</td><td>0.0336 ms</td><td>0.45</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>True</td><td>16.732 ms</td><td>0.1822 ms</td><td>0.1615 ms</td><td>1.00</td><td>0.01</td><td>31093.7500</td><td>31093.7500</td><td>31093.7500</td><td>152806.39 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>True</td><td>6.400 ms</td><td>0.0433 ms</td><td>0.0405 ms</td><td>0.38</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>90.19 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>True</td><td>5.942 ms</td><td>0.0263 ms</td><td>0.0246 ms</td><td>0.36</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>False</td><td>12.939 ms</td><td>0.2225 ms</td><td>0.2081 ms</td><td>1.00</td><td>0.02</td><td>30968.7500</td><td>30968.7500</td><td>30968.7500</td><td>149785.54 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>False</td><td>7.629 ms</td><td>0.0580 ms</td><td>0.0542 ms</td><td>0.59</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>90.19 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>False</td><td>7.261 ms</td><td>0.0326 ms</td><td>0.0305 ms</td><td>0.56</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>True</td><td>16.863 ms</td><td>0.2771 ms</td><td>0.2592 ms</td><td>1.00</td><td>0.02</td><td>31000.0000</td><td>31000.0000</td><td>31000.0000</td><td>152808.33 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>True</td><td>7.669 ms</td><td>0.0231 ms</td><td>0.0205 ms</td><td>0.45</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>90.19 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>True</td><td>7.549 ms</td><td>0.0179 ms</td><td>0.0159 ms</td><td>0.45</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>False</td><td>12.798 ms</td><td>0.1528 ms</td><td>0.1354 ms</td><td>1.00</td><td>0.01</td><td>31093.7500</td><td>31093.7500</td><td>31093.7500</td><td>149783.88 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>False</td><td>6.159 ms</td><td>0.0271 ms</td><td>0.0254 ms</td><td>0.48</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>84.1 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>False</td><td>5.717 ms</td><td>0.0297 ms</td><td>0.0278 ms</td><td>0.45</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>True</td><td>16.770 ms</td><td>0.2249 ms</td><td>0.1994 ms</td><td>1.00</td><td>0.02</td><td>31000.0000</td><td>31000.0000</td><td>31000.0000</td><td>152808.95 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>True</td><td>6.303 ms</td><td>0.0200 ms</td><td>0.0187 ms</td><td>0.38</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>84.09 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>True</td><td>5.892 ms</td><td>0.0306 ms</td><td>0.0271 ms</td><td>0.35</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>False</td><td>12.833 ms</td><td>0.1703 ms</td><td>0.1593 ms</td><td>1.00</td><td>0.02</td><td>30906.2500</td><td>30906.2500</td><td>30906.2500</td><td>149785.61 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>False</td><td>7.533 ms</td><td>0.0313 ms</td><td>0.0293 ms</td><td>0.59</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>84.1 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>False</td><td>7.332 ms</td><td>0.0757 ms</td><td>0.0708 ms</td><td>0.57</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>True</td><td>16.737 ms</td><td>0.1522 ms</td><td>0.1424 ms</td><td>1.00</td><td>0.01</td><td>30843.7500</td><td>30843.7500</td><td>30843.7500</td><td>152809.1 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>True</td><td>7.869 ms</td><td>0.1272 ms</td><td>0.1306 ms</td><td>0.47</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>84.1 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>True</td><td>7.700 ms</td><td>0.0430 ms</td><td>0.0402 ms</td><td>0.46</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>False</td><td>67.905 ms</td><td>1.0653 ms</td><td>0.9965 ms</td><td>1.00</td><td>0.02</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475139.96 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>False</td><td>50.067 ms</td><td>0.2775 ms</td><td>0.2318 ms</td><td>0.74</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>152.94 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>False</td><td>38.029 ms</td><td>0.1908 ms</td><td>0.1691 ms</td><td>0.56</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.18 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>True</td><td>68.023 ms</td><td>0.7208 ms</td><td>0.6742 ms</td><td>1.00</td><td>0.01</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475241.46 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>True</td><td>49.615 ms</td><td>0.2616 ms</td><td>0.2185 ms</td><td>0.73</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>153.84 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>True</td><td>38.742 ms</td><td>0.5025 ms</td><td>0.4700 ms</td><td>0.57</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.16 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>False</td><td>67.503 ms</td><td>0.5250 ms</td><td>0.4911 ms</td><td>1.00</td><td>0.01</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475139.96 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>False</td><td>54.978 ms</td><td>0.3712 ms</td><td>0.3472 ms</td><td>0.81</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>152.97 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>False</td><td>55.342 ms</td><td>0.6950 ms</td><td>0.6501 ms</td><td>0.82</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.2 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>True</td><td>67.141 ms</td><td>0.7187 ms</td><td>0.6723 ms</td><td>1.00</td><td>0.01</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475242.46 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>True</td><td>55.238 ms</td><td>0.4083 ms</td><td>0.3620 ms</td><td>0.82</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>153.81 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>True</td><td>55.611 ms</td><td>0.6153 ms</td><td>0.5455 ms</td><td>0.83</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.2 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>False</td><td>67.356 ms</td><td>0.9105 ms</td><td>0.8516 ms</td><td>1.00</td><td>0.02</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475139.96 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>False</td><td>49.675 ms</td><td>0.2585 ms</td><td>0.2291 ms</td><td>0.74</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>151.84 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>False</td><td>38.757 ms</td><td>0.5684 ms</td><td>0.5316 ms</td><td>0.58</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.18 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>True</td><td>67.781 ms</td><td>0.8108 ms</td><td>0.7584 ms</td><td>1.00</td><td>0.02</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475241.46 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>True</td><td>50.011 ms</td><td>0.3139 ms</td><td>0.2783 ms</td><td>0.74</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>152.71 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>True</td><td>38.277 ms</td><td>0.3770 ms</td><td>0.3342 ms</td><td>0.56</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.19 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>False</td><td>68.033 ms</td><td>0.3997 ms</td><td>0.3543 ms</td><td>1.00</td><td>0.01</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475139.96 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>False</td><td>55.594 ms</td><td>0.6115 ms</td><td>0.5720 ms</td><td>0.82</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>151.84 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>False</td><td>54.920 ms</td><td>0.5788 ms</td><td>0.4833 ms</td><td>0.81</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.2 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>True</td><td>67.402 ms</td><td>0.5253 ms</td><td>0.4913 ms</td><td>1.00</td><td>0.01</td><td>4500.0000</td><td>4500.0000</td><td>4500.0000</td><td>475241.46 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>True</td><td>55.603 ms</td><td>0.2762 ms</td><td>0.2584 ms</td><td>0.82</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>152.71 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>True</td><td>55.607 ms</td><td>0.8436 ms</td><td>0.7891 ms</td><td>0.83</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.2 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>False</td><td>161.591 ms</td><td>0.9670 ms</td><td>0.8572 ms</td><td>1.00</td><td>0.01</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982401.43 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>False</td><td>145.533 ms</td><td>0.4267 ms</td><td>0.3783 ms</td><td>0.90</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>302.67 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>False</td><td>106.953 ms</td><td>1.2315 ms</td><td>1.1519 ms</td><td>0.66</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.89 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>True</td><td>165.246 ms</td><td>0.9796 ms</td><td>0.8684 ms</td><td>1.00</td><td>0.01</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982412.68 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>True</td><td>145.689 ms</td><td>0.2596 ms</td><td>0.2168 ms</td><td>0.88</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>302.75 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>True</td><td>104.584 ms</td><td>1.4235 ms</td><td>1.3315 ms</td><td>0.63</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.89 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>False</td><td>164.530 ms</td><td>1.8653 ms</td><td>1.6536 ms</td><td>1.00</td><td>0.01</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982401.43 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>False</td><td>193.386 ms</td><td>0.9516 ms</td><td>0.8901 ms</td><td>1.18</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>302.79 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>False</td><td>155.647 ms</td><td>0.7430 ms</td><td>0.6950 ms</td><td>0.95</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>True</td><td>163.254 ms</td><td>1.6162 ms</td><td>1.4327 ms</td><td>1.00</td><td>0.01</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982412.68 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>True</td><td>193.135 ms</td><td>0.6995 ms</td><td>0.6543 ms</td><td>1.18</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>302.79 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>True</td><td>156.341 ms</td><td>1.5335 ms</td><td>1.4345 ms</td><td>0.96</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>False</td><td>162.760 ms</td><td>0.8492 ms</td><td>0.7528 ms</td><td>1.00</td><td>0.01</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982401.43 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>False</td><td>145.752 ms</td><td>0.4019 ms</td><td>0.3563 ms</td><td>0.90</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>302.36 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>False</td><td>106.431 ms</td><td>1.2109 ms</td><td>1.1327 ms</td><td>0.65</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.89 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>True</td><td>162.967 ms</td><td>0.6587 ms</td><td>0.5839 ms</td><td>1.00</td><td>0.00</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982412.68 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>True</td><td>145.334 ms</td><td>0.6485 ms</td><td>0.5749 ms</td><td>0.89</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>302.36 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>True</td><td>107.006 ms</td><td>1.1573 ms</td><td>1.0825 ms</td><td>0.66</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>5.3 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>False</td><td>165.372 ms</td><td>1.3997 ms</td><td>1.3092 ms</td><td>1.00</td><td>0.01</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982401.43 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>False</td><td>193.504 ms</td><td>0.5330 ms</td><td>0.4450 ms</td><td>1.17</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>302.4 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>False</td><td>156.217 ms</td><td>1.0279 ms</td><td>0.9615 ms</td><td>0.94</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>True</td><td>165.072 ms</td><td>1.3058 ms</td><td>1.1575 ms</td><td>1.00</td><td>0.01</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>982412.68 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>True</td><td>193.313 ms</td><td>0.9727 ms</td><td>0.9099 ms</td><td>1.17</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>302.4 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>True</td><td>154.430 ms</td><td>0.8261 ms</td><td>0.7727 ms</td><td>0.94</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>False</td><td>205.152 ms</td><td>3.0991 ms</td><td>2.8989 ms</td><td>1.00</td><td>0.02</td><td>666.6667</td><td>666.6667</td><td>666.6667</td><td>1228800.86 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>False</td><td>185.234 ms</td><td>0.5516 ms</td><td>0.5160 ms</td><td>0.90</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.77 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>False</td><td>133.399 ms</td><td>2.2872 ms</td><td>2.1394 ms</td><td>0.65</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.79 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>True</td><td>209.084 ms</td><td>2.0739 ms</td><td>1.9400 ms</td><td>1.00</td><td>0.01</td><td>1000.0000</td><td>1000.0000</td><td>1000.0000</td><td>1228804.78 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>True</td><td>184.856 ms</td><td>0.4621 ms</td><td>0.4323 ms</td><td>0.88</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.93 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>True</td><td>134.795 ms</td><td>1.7589 ms</td><td>1.6453 ms</td><td>0.64</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.79 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>False</td><td>206.649 ms</td><td>2.3928 ms</td><td>2.2382 ms</td><td>1.00</td><td>0.01</td><td>666.6667</td><td>666.6667</td><td>666.6667</td><td>1228800.86 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>False</td><td>252.866 ms</td><td>4.7036 ms</td><td>4.3998 ms</td><td>1.22</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>376.84 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>False</td><td>196.956 ms</td><td>1.5280 ms</td><td>1.4293 ms</td><td>0.95</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.82 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>True</td><td>211.046 ms</td><td>2.1582 ms</td><td>2.0188 ms</td><td>1.00</td><td>0.01</td><td>1000.0000</td><td>1000.0000</td><td>1000.0000</td><td>1228804.78 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>True</td><td>248.802 ms</td><td>0.9233 ms</td><td>0.8637 ms</td><td>1.18</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.93 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>True</td><td>195.758 ms</td><td>1.2749 ms</td><td>1.1925 ms</td><td>0.93</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.82 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>False</td><td>205.676 ms</td><td>1.6540 ms</td><td>1.5471 ms</td><td>1.00</td><td>0.01</td><td>666.6667</td><td>666.6667</td><td>666.6667</td><td>1228800.86 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>False</td><td>184.778 ms</td><td>0.4067 ms</td><td>0.3396 ms</td><td>0.90</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.54 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>False</td><td>133.798 ms</td><td>1.7622 ms</td><td>1.6484 ms</td><td>0.65</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.79 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>True</td><td>206.984 ms</td><td>1.2716 ms</td><td>1.0618 ms</td><td>1.00</td><td>0.01</td><td>1000.0000</td><td>1000.0000</td><td>1000.0000</td><td>1228804.78 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>True</td><td>184.937 ms</td><td>0.8308 ms</td><td>0.7771 ms</td><td>0.89</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.69 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>True</td><td>135.548 ms</td><td>1.2355 ms</td><td>1.1557 ms</td><td>0.65</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.79 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>False</td><td>207.309 ms</td><td>1.7605 ms</td><td>1.6467 ms</td><td>1.00</td><td>0.01</td><td>666.6667</td><td>666.6667</td><td>666.6667</td><td>1228800.86 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>False</td><td>249.065 ms</td><td>1.4479 ms</td><td>1.3543 ms</td><td>1.20</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.6 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>False</td><td>197.765 ms</td><td>1.6204 ms</td><td>1.5157 ms</td><td>0.95</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.82 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>True</td><td>211.886 ms</td><td>1.8052 ms</td><td>1.6886 ms</td><td>1.00</td><td>0.01</td><td>1000.0000</td><td>1000.0000</td><td>1000.0000</td><td>1228804.78 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>True</td><td>248.594 ms</td><td>1.0393 ms</td><td>0.9213 ms</td><td>1.17</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.76 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim bulk fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>True</td><td>194.721 ms</td><td>0.9139 ms</td><td>0.8549 ms</td><td>0.92</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.82 KB</td><td>0.000</td>
 </tr></tbody></table>
 </body>
 </html>
diff --git a/Source/Docs/articles/MemoryStreamBenchmarks.ContinuousGrowFillAndReadThroughputBenchmarks-report-github.md b/Source/Docs/articles/MemoryStreamBenchmarks.ContinuousGrowFillAndReadThroughputBenchmarks-report-github.md
index e304fd6..2aba7ca 100644
--- a/Source/Docs/articles/MemoryStreamBenchmarks.ContinuousGrowFillAndReadThroughputBenchmarks-report-github.md
+++ b/Source/Docs/articles/MemoryStreamBenchmarks.ContinuousGrowFillAndReadThroughputBenchmarks-report-github.md
@@ -10,18 +10,18 @@ Intel Core i9-14900K, 1 CPU, 32 logical and 24 physical cores
 ```
 | Method                                        | ZeroBuffers | ExponentialBufferGrowth | Mean        | Error     | StdDev    | Ratio | RatioSD | Gen0       | Gen1       | Gen2       | Allocated     | Alloc Ratio |
 |---------------------------------------------- |------------ |------------------------ |------------:|----------:|----------:|------:|--------:|-----------:|-----------:|-----------:|--------------:|------------:|
-| **&#39;MemoryStream growth fill and read&#39;**           | **False**       | **False**                   |   **517.92 ms** | **10.113 ms** |  **9.460 ms** |  **1.00** |    **0.03** | **17000.0000** | **17000.0000** | **17000.0000** | **3496975.86 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream growth fill and read&#39; | False       | False                   | 1,994.67 ms | 19.647 ms | 18.378 ms |  3.85 |    0.08 |          - |          - |          - |      73.64 KB |       0.000 |
-| &#39;MemoryStreamSlim growth fill and read&#39;       | False       | False                   |    96.10 ms |  1.530 ms |  1.431 ms |  0.19 |    0.00 |          - |          - |          - |    6247.39 KB |       0.002 |
+| **&#39;MemoryStream growth fill and read&#39;**           | **False**       | **False**                   |   **517.23 ms** | **10.047 ms** | **10.318 ms** |  **1.00** |    **0.03** | **17000.0000** | **17000.0000** | **17000.0000** | **3496975.86 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream growth fill and read&#39; | False       | False                   | 2,054.24 ms | 17.069 ms | 15.966 ms |  3.97 |    0.08 |          - |          - |          - |      73.64 KB |       0.000 |
+| &#39;MemoryStreamSlim growth fill and read&#39;       | False       | False                   |    98.48 ms |  1.957 ms |  2.254 ms |  0.19 |    0.01 |          - |          - |          - |    6247.38 KB |       0.002 |
 |                                               |             |                         |             |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream growth fill and read&#39;**           | **False**       | **True**                    |   **511.74 ms** |  **6.960 ms** |  **6.170 ms** |  **1.00** |    **0.02** | **17000.0000** | **17000.0000** | **17000.0000** | **3496975.88 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream growth fill and read&#39; | False       | True                    |   190.17 ms |  3.758 ms |  6.175 ms |  0.37 |    0.01 |          - |          - |          - |       19.6 KB |       0.000 |
-| &#39;MemoryStreamSlim growth fill and read&#39;       | False       | True                    |    98.83 ms |  1.939 ms |  3.345 ms |  0.19 |    0.01 |          - |          - |          - |    6247.39 KB |       0.002 |
+| **&#39;MemoryStream growth fill and read&#39;**           | **False**       | **True**                    |   **526.32 ms** |  **8.146 ms** |  **7.620 ms** |  **1.00** |    **0.02** | **17000.0000** | **17000.0000** | **17000.0000** | **3496975.81 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream growth fill and read&#39; | False       | True                    |   193.30 ms |  3.844 ms |  4.427 ms |  0.37 |    0.01 |          - |          - |          - |       19.6 KB |       0.000 |
+| &#39;MemoryStreamSlim growth fill and read&#39;       | False       | True                    |    93.86 ms |  1.586 ms |  1.484 ms |  0.18 |    0.00 |          - |          - |          - |    6247.33 KB |       0.002 |
 |                                               |             |                         |             |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream growth fill and read&#39;**           | **True**        | **False**                   |   **520.97 ms** |  **8.836 ms** |  **8.265 ms** |  **1.00** |    **0.02** | **17000.0000** | **17000.0000** | **17000.0000** | **3496975.86 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream growth fill and read&#39; | True        | False                   | 3,934.99 ms | 20.300 ms | 18.989 ms |  7.55 |    0.12 |          - |          - |          - |      73.64 KB |       0.000 |
-| &#39;MemoryStreamSlim growth fill and read&#39;       | True        | False                   |   145.29 ms |  2.854 ms |  4.183 ms |  0.28 |    0.01 |          - |          - |          - |    6247.41 KB |       0.002 |
+| **&#39;MemoryStream growth fill and read&#39;**           | **True**        | **False**                   |   **522.99 ms** |  **7.341 ms** |  **6.866 ms** |  **1.00** |    **0.02** | **17000.0000** | **17000.0000** | **17000.0000** | **3496975.84 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream growth fill and read&#39; | True        | False                   | 3,994.58 ms | 23.239 ms | 21.738 ms |  7.64 |    0.11 |          - |          - |          - |      73.31 KB |       0.000 |
+| &#39;MemoryStreamSlim growth fill and read&#39;       | True        | False                   |   144.28 ms |  2.770 ms |  3.298 ms |  0.28 |    0.01 |          - |          - |          - |    6247.41 KB |       0.002 |
 |                                               |             |                         |             |           |           |       |         |            |            |            |               |             |
-| **&#39;MemoryStream growth fill and read&#39;**           | **True**        | **True**                    |   **506.72 ms** | **10.088 ms** |  **9.908 ms** |  **1.00** |    **0.03** | **17000.0000** | **17000.0000** | **17000.0000** | **3496975.84 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream growth fill and read&#39; | True        | True                    |   360.09 ms |  4.884 ms |  4.568 ms |  0.71 |    0.02 |          - |          - |          - |      19.86 KB |       0.000 |
-| &#39;MemoryStreamSlim growth fill and read&#39;       | True        | True                    |   146.15 ms |  2.854 ms |  4.272 ms |  0.29 |    0.01 |          - |          - |          - |    6247.41 KB |       0.002 |
+| **&#39;MemoryStream growth fill and read&#39;**           | **True**        | **True**                    |   **527.70 ms** | **10.026 ms** |  **9.378 ms** |  **1.00** |    **0.02** | **17000.0000** | **17000.0000** | **17000.0000** | **3496975.81 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream growth fill and read&#39; | True        | True                    |   370.41 ms |  3.702 ms |  3.282 ms |  0.70 |    0.01 |          - |          - |          - |      19.86 KB |       0.000 |
+| &#39;MemoryStreamSlim growth fill and read&#39;       | True        | True                    |   141.66 ms |  1.979 ms |  1.852 ms |  0.27 |    0.01 |          - |          - |          - |    6247.41 KB |       0.002 |
diff --git a/Source/Docs/articles/MemoryStreamBenchmarks.ContinuousGrowFillAndReadThroughputBenchmarks-report.html b/Source/Docs/articles/MemoryStreamBenchmarks.ContinuousGrowFillAndReadThroughputBenchmarks-report.html
index 5f9ebe6..5332017 100644
--- a/Source/Docs/articles/MemoryStreamBenchmarks.ContinuousGrowFillAndReadThroughputBenchmarks-report.html
+++ b/Source/Docs/articles/MemoryStreamBenchmarks.ContinuousGrowFillAndReadThroughputBenchmarks-report.html
@@ -2,7 +2,7 @@
 <html lang='en'>
 <head>
 <meta charset='utf-8' />
-<title>MemoryStreamBenchmarks.ContinuousGrowFillAndReadThroughputBenchmarks-20241011-211140</title>
+<title>MemoryStreamBenchmarks.ContinuousGrowFillAndReadThroughputBenchmarks-20241024-194941</title>
 
 <style type="text/css">
 	table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
@@ -24,18 +24,18 @@
 <table>
 <thead><tr><th>Method                                 </th><th>ZeroBuffers</th><th>ExponentialBufferGrowth</th><th>Mean </th><th>Error</th><th>StdDev</th><th>Ratio</th><th>RatioSD</th><th>Gen0</th><th>Gen1</th><th>Gen2</th><th>Allocated</th><th>Alloc Ratio</th>
 </tr>
-</thead><tbody><tr><td>&#39;MemoryStream growth fill and read&#39;</td><td>False</td><td>False</td><td>517.92 ms</td><td>10.113 ms</td><td>9.460 ms</td><td>1.00</td><td>0.03</td><td>17000.0000</td><td>17000.0000</td><td>17000.0000</td><td>3496975.86 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream growth fill and read&#39;</td><td>False</td><td>False</td><td>1,994.67 ms</td><td>19.647 ms</td><td>18.378 ms</td><td>3.85</td><td>0.08</td><td>-</td><td>-</td><td>-</td><td>73.64 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim growth fill and read&#39;</td><td>False</td><td>False</td><td>96.10 ms</td><td>1.530 ms</td><td>1.431 ms</td><td>0.19</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>6247.39 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStream growth fill and read&#39;</td><td>False</td><td>True</td><td>511.74 ms</td><td>6.960 ms</td><td>6.170 ms</td><td>1.00</td><td>0.02</td><td>17000.0000</td><td>17000.0000</td><td>17000.0000</td><td>3496975.88 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream growth fill and read&#39;</td><td>False</td><td>True</td><td>190.17 ms</td><td>3.758 ms</td><td>6.175 ms</td><td>0.37</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>19.6 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim growth fill and read&#39;</td><td>False</td><td>True</td><td>98.83 ms</td><td>1.939 ms</td><td>3.345 ms</td><td>0.19</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>6247.39 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStream growth fill and read&#39;</td><td>True</td><td>False</td><td>520.97 ms</td><td>8.836 ms</td><td>8.265 ms</td><td>1.00</td><td>0.02</td><td>17000.0000</td><td>17000.0000</td><td>17000.0000</td><td>3496975.86 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream growth fill and read&#39;</td><td>True</td><td>False</td><td>3,934.99 ms</td><td>20.300 ms</td><td>18.989 ms</td><td>7.55</td><td>0.12</td><td>-</td><td>-</td><td>-</td><td>73.64 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim growth fill and read&#39;</td><td>True</td><td>False</td><td>145.29 ms</td><td>2.854 ms</td><td>4.183 ms</td><td>0.28</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>6247.41 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStream growth fill and read&#39;</td><td>True</td><td>True</td><td>506.72 ms</td><td>10.088 ms</td><td>9.908 ms</td><td>1.00</td><td>0.03</td><td>17000.0000</td><td>17000.0000</td><td>17000.0000</td><td>3496975.84 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream growth fill and read&#39;</td><td>True</td><td>True</td><td>360.09 ms</td><td>4.884 ms</td><td>4.568 ms</td><td>0.71</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>19.86 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim growth fill and read&#39;</td><td>True</td><td>True</td><td>146.15 ms</td><td>2.854 ms</td><td>4.272 ms</td><td>0.29</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>6247.41 KB</td><td>0.002</td>
+</thead><tbody><tr><td>&#39;MemoryStream growth fill and read&#39;</td><td>False</td><td>False</td><td>517.23 ms</td><td>10.047 ms</td><td>10.318 ms</td><td>1.00</td><td>0.03</td><td>17000.0000</td><td>17000.0000</td><td>17000.0000</td><td>3496975.86 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream growth fill and read&#39;</td><td>False</td><td>False</td><td>2,054.24 ms</td><td>17.069 ms</td><td>15.966 ms</td><td>3.97</td><td>0.08</td><td>-</td><td>-</td><td>-</td><td>73.64 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim growth fill and read&#39;</td><td>False</td><td>False</td><td>98.48 ms</td><td>1.957 ms</td><td>2.254 ms</td><td>0.19</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>6247.38 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStream growth fill and read&#39;</td><td>False</td><td>True</td><td>526.32 ms</td><td>8.146 ms</td><td>7.620 ms</td><td>1.00</td><td>0.02</td><td>17000.0000</td><td>17000.0000</td><td>17000.0000</td><td>3496975.81 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream growth fill and read&#39;</td><td>False</td><td>True</td><td>193.30 ms</td><td>3.844 ms</td><td>4.427 ms</td><td>0.37</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>19.6 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim growth fill and read&#39;</td><td>False</td><td>True</td><td>93.86 ms</td><td>1.586 ms</td><td>1.484 ms</td><td>0.18</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>6247.33 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStream growth fill and read&#39;</td><td>True</td><td>False</td><td>522.99 ms</td><td>7.341 ms</td><td>6.866 ms</td><td>1.00</td><td>0.02</td><td>17000.0000</td><td>17000.0000</td><td>17000.0000</td><td>3496975.84 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream growth fill and read&#39;</td><td>True</td><td>False</td><td>3,994.58 ms</td><td>23.239 ms</td><td>21.738 ms</td><td>7.64</td><td>0.11</td><td>-</td><td>-</td><td>-</td><td>73.31 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim growth fill and read&#39;</td><td>True</td><td>False</td><td>144.28 ms</td><td>2.770 ms</td><td>3.298 ms</td><td>0.28</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>6247.41 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStream growth fill and read&#39;</td><td>True</td><td>True</td><td>527.70 ms</td><td>10.026 ms</td><td>9.378 ms</td><td>1.00</td><td>0.02</td><td>17000.0000</td><td>17000.0000</td><td>17000.0000</td><td>3496975.81 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream growth fill and read&#39;</td><td>True</td><td>True</td><td>370.41 ms</td><td>3.702 ms</td><td>3.282 ms</td><td>0.70</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>19.86 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim growth fill and read&#39;</td><td>True</td><td>True</td><td>141.66 ms</td><td>1.979 ms</td><td>1.852 ms</td><td>0.27</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>6247.41 KB</td><td>0.002</td>
 </tr></tbody></table>
 </body>
 </html>
diff --git a/Source/Docs/articles/MemoryStreamBenchmarks.CopyToAsyncThroughputBenchmarks-report-github.md b/Source/Docs/articles/MemoryStreamBenchmarks.CopyToAsyncThroughputBenchmarks-report-github.md
index ba04a5d..b3598f4 100644
--- a/Source/Docs/articles/MemoryStreamBenchmarks.CopyToAsyncThroughputBenchmarks-report-github.md
+++ b/Source/Docs/articles/MemoryStreamBenchmarks.CopyToAsyncThroughputBenchmarks-report-github.md
@@ -8,44 +8,84 @@ Intel Core i9-14900K, 1 CPU, 32 logical and 24 physical cores
 
 
 ```
-| Method                               | DataSize  | CapacityOnCreate | Mean         | Error     | StdDev    | Median       | Ratio | RatioSD | Gen0       | Gen1       | Gen2       | Allocated     | Alloc Ratio |
-|------------------------------------- |---------- |----------------- |-------------:|----------:|----------:|-------------:|------:|--------:|-----------:|-----------:|-----------:|--------------:|------------:|
-| **&#39;MemoryStream CopyToAsync&#39;**           | **131072**    | **False**            |     **97.00 ms** |  **1.516 ms** |  **1.418 ms** |     **96.15 ms** |  **1.00** |    **0.02** |  **4000.0000** |  **4000.0000** |  **4000.0000** |   **12832.56 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream CopyToAsync&#39; | 131072    | False            |     97.27 ms |  1.343 ms |  1.256 ms |     97.98 ms |  1.00 |    0.02 |          - |          - |          - |      48.87 KB |       0.004 |
-| &#39;MemoryStreamSlim CopyToAsync&#39;       | 131072    | False            |     97.23 ms |  1.460 ms |  1.366 ms |     96.85 ms |  1.00 |    0.02 |          - |          - |          - |      54.14 KB |       0.004 |
-|                                      |           |                  |              |           |           |              |       |         |            |            |            |               |             |
-| **&#39;MemoryStream CopyToAsync&#39;**           | **131072**    | **True**             |     **97.28 ms** |  **1.536 ms** |  **1.437 ms** |     **97.56 ms** |  **1.00** |    **0.02** |  **4000.0000** |  **4000.0000** |  **4000.0000** |   **12832.56 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream CopyToAsync&#39; | 131072    | True             |     96.99 ms |  1.347 ms |  1.260 ms |     96.07 ms |  1.00 |    0.02 |          - |          - |          - |      48.88 KB |       0.004 |
-| &#39;MemoryStreamSlim CopyToAsync&#39;       | 131072    | True             |     97.24 ms |  1.580 ms |  1.478 ms |     97.88 ms |  1.00 |    0.02 |          - |          - |          - |      54.14 KB |       0.004 |
-|                                      |           |                  |              |           |           |              |       |         |            |            |            |               |             |
-| **&#39;MemoryStream CopyToAsync&#39;**           | **983040**    | **False**            |     **51.38 ms** |  **0.181 ms** |  **0.142 ms** |     **51.38 ms** |  **1.00** |    **0.00** | **10000.0000** | **10000.0000** | **10000.0000** |   **50909.75 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream CopyToAsync&#39; | 983040    | False            |    412.25 ms |  7.848 ms |  8.397 ms |    418.28 ms |  8.02 |    0.16 |          - |          - |          - |      82.72 KB |       0.002 |
-| &#39;MemoryStreamSlim CopyToAsync&#39;       | 983040    | False            |     51.30 ms |  0.179 ms |  0.150 ms |     51.29 ms |  1.00 |    0.00 |          - |          - |          - |      28.75 KB |       0.001 |
-|                                      |           |                  |              |           |           |              |       |         |            |            |            |               |             |
-| **&#39;MemoryStream CopyToAsync&#39;**           | **983040**    | **True**             |     **51.51 ms** |  **0.281 ms** |  **0.220 ms** |     **51.54 ms** |  **1.00** |    **0.01** |  **9700.0000** |  **9700.0000** |  **9700.0000** |   **50911.02 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream CopyToAsync&#39; | 983040    | True             |    412.65 ms |  7.871 ms |  8.083 ms |    418.06 ms |  8.01 |    0.16 |          - |          - |          - |      80.65 KB |       0.002 |
-| &#39;MemoryStreamSlim CopyToAsync&#39;       | 983040    | True             |     51.62 ms |  0.731 ms |  0.683 ms |     51.32 ms |  1.00 |    0.01 |          - |          - |          - |      28.69 KB |       0.001 |
-|                                      |           |                  |              |           |           |              |       |         |            |            |            |               |             |
-| **&#39;MemoryStream CopyToAsync&#39;**           | **16777216**  | **False**            |     **62.63 ms** |  **1.248 ms** |  **3.266 ms** |     **62.67 ms** |  **1.00** |    **0.07** |  **3777.7778** |  **3777.7778** |  **3777.7778** |  **294919.82 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream CopyToAsync&#39; | 16777216  | False            |  2,241.10 ms |  3.077 ms |  2.878 ms |  2,240.21 ms | 35.88 |    1.87 |          - |          - |          - |     270.13 KB |       0.001 |
-| &#39;MemoryStreamSlim CopyToAsync&#39;       | 16777216  | False            |    105.28 ms |  0.985 ms |  0.873 ms |    105.45 ms |  1.69 |    0.09 |          - |          - |          - |      20.67 KB |       0.000 |
-|                                      |           |                  |              |           |           |              |       |         |            |            |            |               |             |
-| **&#39;MemoryStream CopyToAsync&#39;**           | **16777216**  | **True**             |     **63.02 ms** |  **1.265 ms** |  **3.730 ms** |     **62.54 ms** |  **1.00** |    **0.08** |  **2250.0000** |  **2250.0000** |  **2250.0000** |  **294918.94 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream CopyToAsync&#39; | 16777216  | True             |  2,240.43 ms |  4.602 ms |  4.079 ms |  2,239.98 ms | 35.68 |    2.14 |          - |          - |          - |     269.16 KB |       0.001 |
-| &#39;MemoryStreamSlim CopyToAsync&#39;       | 16777216  | True             |    106.96 ms |  2.033 ms |  2.088 ms |    106.57 ms |  1.70 |    0.11 |          - |          - |          - |      20.64 KB |       0.000 |
-|                                      |           |                  |              |           |           |              |       |         |            |            |            |               |             |
-| **&#39;MemoryStream CopyToAsync&#39;**           | **100597760** | **False**            |    **154.35 ms** |  **3.068 ms** |  **3.880 ms** |    **155.13 ms** |  **1.00** |    **0.03** |  **1333.3333** |  **1333.3333** |  **1333.3333** |  **884163.72 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream CopyToAsync&#39; | 100597760 | False            |  6,864.97 ms |  3.526 ms |  2.753 ms |  6,865.42 ms | 44.50 |    1.11 |          - |          - |          - |     780.39 KB |       0.001 |
-| &#39;MemoryStreamSlim CopyToAsync&#39;       | 100597760 | False            |    194.24 ms |  3.529 ms |  3.301 ms |    194.70 ms |  1.26 |    0.04 |          - |          - |          - |      13.98 KB |       0.000 |
-|                                      |           |                  |              |           |           |              |       |         |            |            |            |               |             |
-| **&#39;MemoryStream CopyToAsync&#39;**           | **100597760** | **True**             |    **155.11 ms** |  **3.077 ms** |  **3.022 ms** |    **155.77 ms** |  **1.00** |    **0.03** |  **1000.0000** |  **1000.0000** |  **1000.0000** |  **884163.71 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream CopyToAsync&#39; | 100597760 | True             |  6,883.67 ms | 38.221 ms | 35.752 ms |  6,866.52 ms | 44.39 |    0.89 |          - |          - |          - |      779.4 KB |       0.001 |
-| &#39;MemoryStreamSlim CopyToAsync&#39;       | 100597760 | True             |    197.39 ms |  3.571 ms |  3.340 ms |    197.86 ms |  1.27 |    0.03 |          - |          - |          - |      13.96 KB |       0.000 |
-|                                      |           |                  |              |           |           |              |       |         |            |            |            |               |             |
-| **&#39;MemoryStream CopyToAsync&#39;**           | **209715200** | **False**            |    **254.51 ms** |  **4.965 ms** |  **5.313 ms** |    **254.85 ms** |  **1.00** |    **0.03** |  **1000.0000** |  **1000.0000** |  **1000.0000** | **1433603.27 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream CopyToAsync&#39; | 209715200 | False            | 11,080.87 ms | 84.676 ms | 79.206 ms | 11,048.63 ms | 43.56 |    0.95 |          - |          - |          - |    1258.32 KB |       0.001 |
-| &#39;MemoryStreamSlim CopyToAsync&#39;       | 209715200 | False            |    293.98 ms |  7.749 ms | 22.848 ms |    298.86 ms |  1.16 |    0.09 |          - |          - |          - |      13.78 KB |       0.000 |
-|                                      |           |                  |              |           |           |              |       |         |            |            |            |               |             |
-| **&#39;MemoryStream CopyToAsync&#39;**           | **209715200** | **True**             |    **251.42 ms** |  **3.941 ms** |  **3.687 ms** |    **251.85 ms** |  **1.00** |    **0.02** |  **1000.0000** |  **1000.0000** |  **1000.0000** | **1433603.04 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream CopyToAsync&#39; | 209715200 | True             | 11,006.20 ms | 10.644 ms |  8.888 ms | 11,006.01 ms | 43.79 |    0.63 |          - |          - |          - |    1257.17 KB |       0.001 |
-| &#39;MemoryStreamSlim CopyToAsync&#39;       | 209715200 | True             |    300.30 ms |  5.971 ms | 15.624 ms |    303.85 ms |  1.19 |    0.06 |          - |          - |          - |      13.78 KB |       0.000 |
+| Method                               | DataSize  | CapacityOnCreate | BulkFill | Mean         | Error     | StdDev    | Ratio | RatioSD | Gen0       | Gen1       | Gen2       | Allocated     | Alloc Ratio |
+|------------------------------------- |---------- |----------------- |--------- |-------------:|----------:|----------:|------:|--------:|-----------:|-----------:|-----------:|--------------:|------------:|
+| **&#39;MemoryStream CopyToAsync&#39;**           | **131072**    | **False**            | **False**    |     **97.21 ms** |  **1.487 ms** |  **1.391 ms** |  **1.00** |    **0.02** |  **4000.0000** |  **4000.0000** |  **4000.0000** |   **25244.37 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 131072    | False            | False    |     97.35 ms |  1.708 ms |  1.598 ms |  1.00 |    0.02 |          - |          - |          - |      48.96 KB |       0.002 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 131072    | False            | False    |     97.14 ms |  1.292 ms |  1.208 ms |  1.00 |    0.02 |          - |          - |          - |      54.63 KB |       0.002 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **131072**    | **False**            | **True**     |     **97.21 ms** |  **1.500 ms** |  **1.403 ms** |  **1.00** |    **0.02** |  **4000.0000** |  **4000.0000** |  **4000.0000** |   **12832.46 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 131072    | False            | True     |     97.09 ms |  1.479 ms |  1.384 ms |  1.00 |    0.02 |          - |          - |          - |      48.87 KB |       0.004 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 131072    | False            | True     |     97.18 ms |  1.426 ms |  1.334 ms |  1.00 |    0.02 |          - |          - |          - |      54.53 KB |       0.004 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **131072**    | **True**             | **False**    |     **97.14 ms** |  **1.495 ms** |  **1.399 ms** |  **1.00** |    **0.02** |  **4000.0000** |  **4000.0000** |  **4000.0000** |   **12832.65 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 131072    | True             | False    |     97.27 ms |  1.422 ms |  1.330 ms |  1.00 |    0.02 |          - |          - |          - |      48.94 KB |       0.004 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 131072    | True             | False    |     97.65 ms |  1.478 ms |  1.383 ms |  1.01 |    0.02 |          - |          - |          - |      54.73 KB |       0.004 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **131072**    | **True**             | **True**     |     **97.37 ms** |  **1.273 ms** |  **1.191 ms** |  **1.00** |    **0.02** |  **4000.0000** |  **4000.0000** |  **4000.0000** |   **12832.56 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 131072    | True             | True     |     97.20 ms |  1.403 ms |  1.312 ms |  1.00 |    0.02 |          - |          - |          - |      48.87 KB |       0.004 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 131072    | True             | True     |     97.36 ms |  1.917 ms |  1.793 ms |  1.00 |    0.02 |          - |          - |          - |      54.43 KB |       0.004 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **983040**    | **False**            | **False**    |     **51.52 ms** |  **0.231 ms** |  **0.180 ms** |  **1.00** |    **0.00** | **21700.0000** | **21400.0000** | **21400.0000** |  **108382.09 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 983040    | False            | False    |    413.00 ms |  7.802 ms |  8.012 ms |  8.02 |    0.15 |          - |          - |          - |      99.86 KB |       0.001 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 983040    | False            | False    |    154.37 ms |  2.038 ms |  1.806 ms |  3.00 |    0.04 |          - |          - |          - |      45.49 KB |       0.000 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **983040**    | **False**            | **True**     |     **51.89 ms** |  **0.772 ms** |  **0.722 ms** |  **1.00** |    **0.02** | **10200.0000** | **10200.0000** | **10200.0000** |   **50918.65 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 983040    | False            | True     |    412.55 ms |  8.095 ms |  8.313 ms |  7.95 |    0.19 |          - |          - |          - |      82.14 KB |       0.002 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 983040    | False            | True     |     51.32 ms |  0.213 ms |  0.178 ms |  0.99 |    0.01 |          - |          - |          - |      28.89 KB |       0.001 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **983040**    | **True**             | **False**    |     **51.49 ms** |  **0.155 ms** |  **0.129 ms** |  **1.00** |    **0.00** |  **9900.0000** |  **9900.0000** |  **9900.0000** |   **50912.75 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 983040    | True             | False    |    412.82 ms |  7.923 ms |  7.411 ms |  8.02 |    0.14 |          - |          - |          - |      81.23 KB |       0.002 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 983040    | True             | False    |     51.40 ms |  0.372 ms |  0.311 ms |  1.00 |    0.01 |          - |          - |          - |      29.06 KB |       0.001 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **983040**    | **True**             | **True**     |     **51.45 ms** |  **0.259 ms** |  **0.202 ms** |  **1.00** |    **0.01** | **10000.0000** | **10000.0000** | **10000.0000** |   **50913.69 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 983040    | True             | True     |    412.19 ms |  8.038 ms |  8.255 ms |  8.01 |    0.16 |          - |          - |          - |      80.81 KB |       0.002 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 983040    | True             | True     |     51.33 ms |  0.190 ms |  0.159 ms |  1.00 |    0.00 |          - |          - |          - |      28.89 KB |       0.001 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **16777216**  | **False**            | **False**    |    **123.56 ms** |  **2.467 ms** |  **6.369 ms** |  **1.00** |    **0.07** | **14250.0000** | **14250.0000** | **14250.0000** |  **589770.58 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 16777216  | False            | False    |  2,243.11 ms |  4.153 ms |  3.885 ms | 18.20 |    0.98 |          - |          - |          - |    1484.61 KB |       0.003 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 16777216  | False            | False    |    122.55 ms |  1.575 ms |  1.473 ms |  0.99 |    0.05 |          - |          - |          - |       22.4 KB |       0.000 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **16777216**  | **False**            | **True**     |     **62.10 ms** |  **1.228 ms** |  **2.797 ms** |  **1.00** |    **0.06** |  **2666.6667** |  **2666.6667** |  **2666.6667** |  **294919.89 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 16777216  | False            | True     |  2,242.24 ms |  4.267 ms |  3.991 ms | 36.18 |    1.62 |          - |          - |          - |     270.73 KB |       0.001 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 16777216  | False            | True     |    105.10 ms |  1.454 ms |  1.214 ms |  1.70 |    0.08 |          - |          - |          - |      20.95 KB |       0.000 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **16777216**  | **True**             | **False**    |     **59.31 ms** |  **1.180 ms** |  **3.024 ms** |  **1.00** |    **0.07** |  **3888.8889** |  **3888.8889** |  **3888.8889** |  **294919.96 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 16777216  | True             | False    |  2,241.13 ms |  2.941 ms |  2.751 ms | 37.88 |    1.88 |          - |          - |          - |     270.17 KB |       0.001 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 16777216  | True             | False    |    105.09 ms |  1.351 ms |  1.264 ms |  1.78 |    0.09 |          - |          - |          - |      21.22 KB |       0.000 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **16777216**  | **True**             | **True**     |     **63.68 ms** |  **1.273 ms** |  **2.899 ms** |  **1.00** |    **0.06** |  **2250.0000** |  **2250.0000** |  **2250.0000** |  **294920.91 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 16777216  | True             | True     |  2,242.01 ms |  2.668 ms |  2.496 ms | 35.28 |    1.59 |          - |          - |          - |     269.42 KB |       0.001 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 16777216  | True             | True     |    105.37 ms |  1.098 ms |  0.917 ms |  1.66 |    0.08 |          - |          - |          - |      20.92 KB |       0.000 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **100597760** | **False**            | **False**    |    **365.85 ms** |  **6.980 ms** |  **7.168 ms** |  **1.00** |    **0.03** |  **5000.0000** |  **5000.0000** |  **5000.0000** |  **2359269.8 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 100597760 | False            | False    |  6,855.08 ms | 13.537 ms | 12.663 ms | 18.74 |    0.36 |  1000.0000 |          - |          - |   21650.17 KB |       0.009 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 100597760 | False            | False    |    227.83 ms |  1.799 ms |  1.682 ms |  0.62 |    0.01 |          - |          - |          - |      15.63 KB |       0.000 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **100597760** | **False**            | **True**     |    **158.88 ms** |  **2.336 ms** |  **1.951 ms** |  **1.00** |    **0.02** |  **1500.0000** |  **1500.0000** |  **1500.0000** |  **884163.94 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 100597760 | False            | True     |  6,866.32 ms |  4.994 ms |  4.427 ms | 43.22 |    0.51 |          - |          - |          - |     780.08 KB |       0.001 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 100597760 | False            | True     |    194.68 ms |  3.563 ms |  3.333 ms |  1.23 |    0.02 |          - |          - |          - |       14.1 KB |       0.000 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **100597760** | **True**             | **False**    |    **167.47 ms** |  **3.293 ms** |  **3.081 ms** |  **1.00** |    **0.03** |  **1666.6667** |  **1666.6667** |  **1666.6667** |  **884163.99 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 100597760 | True             | False    |  6,819.94 ms | 22.623 ms | 20.055 ms | 40.74 |    0.75 |          - |          - |          - |     779.05 KB |       0.001 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 100597760 | True             | False    |    195.53 ms |  3.857 ms |  4.127 ms |  1.17 |    0.03 |          - |          - |          - |      14.23 KB |       0.000 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **100597760** | **True**             | **True**     |    **159.22 ms** |  **0.974 ms** |  **0.813 ms** |  **1.00** |    **0.01** |  **1750.0000** |  **1750.0000** |  **1750.0000** |  **884164.07 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 100597760 | True             | True     |  6,870.64 ms |  3.764 ms |  3.337 ms | 43.15 |    0.21 |          - |          - |          - |     780.04 KB |       0.001 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 100597760 | True             | True     |    193.42 ms |  3.186 ms |  2.980 ms |  1.21 |    0.02 |          - |          - |          - |       14.1 KB |       0.000 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **209715200** | **False**            | **False**    |    **528.07 ms** |  **7.478 ms** |  **6.995 ms** |  **1.00** |    **0.02** |  **3000.0000** |  **3000.0000** |  **3000.0000** | **3669995.33 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 209715200 | False            | False    | 11,011.70 ms |  6.434 ms |  6.018 ms | 20.86 |    0.27 |  3000.0000 |          - |          - |   71563.52 KB |       0.019 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 209715200 | False            | False    |    341.75 ms |  2.868 ms |  2.683 ms |  0.65 |    0.01 |          - |          - |          - |      14.34 KB |       0.000 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **209715200** | **False**            | **True**     |    **240.95 ms** |  **3.243 ms** |  **3.033 ms** |  **1.00** |    **0.02** |  **1000.0000** |  **1000.0000** |  **1000.0000** | **1433603.27 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 209715200 | False            | True     | 11,016.41 ms | 11.702 ms | 10.373 ms | 45.73 |    0.57 |          - |          - |          - |    1257.58 KB |       0.001 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 209715200 | False            | True     |    313.58 ms |  6.013 ms |  6.175 ms |  1.30 |    0.03 |          - |          - |          - |      13.89 KB |       0.000 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **209715200** | **True**             | **False**    |    **257.98 ms** |  **5.115 ms** |  **5.023 ms** |  **1.00** |    **0.03** |  **1000.0000** |  **1000.0000** |  **1000.0000** | **1433603.16 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 209715200 | True             | False    | 11,014.72 ms | 10.105 ms |  9.452 ms | 42.71 |    0.82 |          - |          - |          - |    1258.28 KB |       0.001 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 209715200 | True             | False    |    328.06 ms |  1.504 ms |  1.407 ms |  1.27 |    0.02 |          - |          - |          - |      13.95 KB |       0.000 |
+|                                      |           |                  |          |              |           |           |       |         |            |            |            |               |             |
+| **&#39;MemoryStream CopyToAsync&#39;**           | **209715200** | **True**             | **True**     |    **241.43 ms** |  **2.493 ms** |  **2.332 ms** |  **1.00** |    **0.01** |  **1000.0000** |  **1000.0000** |  **1000.0000** | **1433603.01 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream CopyToAsync&#39; | 209715200 | True             | True     | 11,012.98 ms |  7.765 ms |  6.883 ms | 45.62 |    0.43 |          - |          - |          - |    1257.04 KB |       0.001 |
+| &#39;MemoryStreamSlim CopyToAsync&#39;       | 209715200 | True             | True     |    309.68 ms |  6.123 ms | 14.191 ms |  1.28 |    0.06 |          - |          - |          - |      13.89 KB |       0.000 |
diff --git a/Source/Docs/articles/MemoryStreamBenchmarks.CopyToAsyncThroughputBenchmarks-report.html b/Source/Docs/articles/MemoryStreamBenchmarks.CopyToAsyncThroughputBenchmarks-report.html
index ba8e838..f3c4bce 100644
--- a/Source/Docs/articles/MemoryStreamBenchmarks.CopyToAsyncThroughputBenchmarks-report.html
+++ b/Source/Docs/articles/MemoryStreamBenchmarks.CopyToAsyncThroughputBenchmarks-report.html
@@ -2,7 +2,7 @@
 <html lang='en'>
 <head>
 <meta charset='utf-8' />
-<title>MemoryStreamBenchmarks.CopyToAsyncThroughputBenchmarks-20241011-211707</title>
+<title>MemoryStreamBenchmarks.CopyToAsyncThroughputBenchmarks-20241024-195446</title>
 
 <style type="text/css">
 	table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
@@ -22,38 +22,68 @@
 <pre><code></code></pre>
 
 <table>
-<thead><tr><th>Method                        </th><th>DataSize</th><th>CapacityOnCreate</th><th>Mean  </th><th>Error</th><th>StdDev</th><th>Median</th><th>Ratio</th><th>RatioSD</th><th>Gen0</th><th>Gen1</th><th>Gen2</th><th>Allocated</th><th>Alloc Ratio</th>
+<thead><tr><th>Method                        </th><th>DataSize</th><th>CapacityOnCreate</th><th>BulkFill</th><th>Mean  </th><th>Error</th><th>StdDev</th><th>Ratio</th><th>RatioSD</th><th>Gen0</th><th>Gen1</th><th>Gen2</th><th>Allocated</th><th>Alloc Ratio</th>
 </tr>
-</thead><tbody><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>131072</td><td>False</td><td>97.00 ms</td><td>1.516 ms</td><td>1.418 ms</td><td>96.15 ms</td><td>1.00</td><td>0.02</td><td>4000.0000</td><td>4000.0000</td><td>4000.0000</td><td>12832.56 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>131072</td><td>False</td><td>97.27 ms</td><td>1.343 ms</td><td>1.256 ms</td><td>97.98 ms</td><td>1.00</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>48.87 KB</td><td>0.004</td>
-</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>131072</td><td>False</td><td>97.23 ms</td><td>1.460 ms</td><td>1.366 ms</td><td>96.85 ms</td><td>1.00</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>54.14 KB</td><td>0.004</td>
-</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>131072</td><td>True</td><td>97.28 ms</td><td>1.536 ms</td><td>1.437 ms</td><td>97.56 ms</td><td>1.00</td><td>0.02</td><td>4000.0000</td><td>4000.0000</td><td>4000.0000</td><td>12832.56 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>131072</td><td>True</td><td>96.99 ms</td><td>1.347 ms</td><td>1.260 ms</td><td>96.07 ms</td><td>1.00</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>48.88 KB</td><td>0.004</td>
-</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>131072</td><td>True</td><td>97.24 ms</td><td>1.580 ms</td><td>1.478 ms</td><td>97.88 ms</td><td>1.00</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>54.14 KB</td><td>0.004</td>
-</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>983040</td><td>False</td><td>51.38 ms</td><td>0.181 ms</td><td>0.142 ms</td><td>51.38 ms</td><td>1.00</td><td>0.00</td><td>10000.0000</td><td>10000.0000</td><td>10000.0000</td><td>50909.75 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>983040</td><td>False</td><td>412.25 ms</td><td>7.848 ms</td><td>8.397 ms</td><td>418.28 ms</td><td>8.02</td><td>0.16</td><td>-</td><td>-</td><td>-</td><td>82.72 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>983040</td><td>False</td><td>51.30 ms</td><td>0.179 ms</td><td>0.150 ms</td><td>51.29 ms</td><td>1.00</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>28.75 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>983040</td><td>True</td><td>51.51 ms</td><td>0.281 ms</td><td>0.220 ms</td><td>51.54 ms</td><td>1.00</td><td>0.01</td><td>9700.0000</td><td>9700.0000</td><td>9700.0000</td><td>50911.02 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>983040</td><td>True</td><td>412.65 ms</td><td>7.871 ms</td><td>8.083 ms</td><td>418.06 ms</td><td>8.01</td><td>0.16</td><td>-</td><td>-</td><td>-</td><td>80.65 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>983040</td><td>True</td><td>51.62 ms</td><td>0.731 ms</td><td>0.683 ms</td><td>51.32 ms</td><td>1.00</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>28.69 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>16777216</td><td>False</td><td>62.63 ms</td><td>1.248 ms</td><td>3.266 ms</td><td>62.67 ms</td><td>1.00</td><td>0.07</td><td>3777.7778</td><td>3777.7778</td><td>3777.7778</td><td>294919.82 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>16777216</td><td>False</td><td>2,241.10 ms</td><td>3.077 ms</td><td>2.878 ms</td><td>2,240.21 ms</td><td>35.88</td><td>1.87</td><td>-</td><td>-</td><td>-</td><td>270.13 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>16777216</td><td>False</td><td>105.28 ms</td><td>0.985 ms</td><td>0.873 ms</td><td>105.45 ms</td><td>1.69</td><td>0.09</td><td>-</td><td>-</td><td>-</td><td>20.67 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>16777216</td><td>True</td><td>63.02 ms</td><td>1.265 ms</td><td>3.730 ms</td><td>62.54 ms</td><td>1.00</td><td>0.08</td><td>2250.0000</td><td>2250.0000</td><td>2250.0000</td><td>294918.94 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>16777216</td><td>True</td><td>2,240.43 ms</td><td>4.602 ms</td><td>4.079 ms</td><td>2,239.98 ms</td><td>35.68</td><td>2.14</td><td>-</td><td>-</td><td>-</td><td>269.16 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>16777216</td><td>True</td><td>106.96 ms</td><td>2.033 ms</td><td>2.088 ms</td><td>106.57 ms</td><td>1.70</td><td>0.11</td><td>-</td><td>-</td><td>-</td><td>20.64 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>100597760</td><td>False</td><td>154.35 ms</td><td>3.068 ms</td><td>3.880 ms</td><td>155.13 ms</td><td>1.00</td><td>0.03</td><td>1333.3333</td><td>1333.3333</td><td>1333.3333</td><td>884163.72 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>100597760</td><td>False</td><td>6,864.97 ms</td><td>3.526 ms</td><td>2.753 ms</td><td>6,865.42 ms</td><td>44.50</td><td>1.11</td><td>-</td><td>-</td><td>-</td><td>780.39 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>100597760</td><td>False</td><td>194.24 ms</td><td>3.529 ms</td><td>3.301 ms</td><td>194.70 ms</td><td>1.26</td><td>0.04</td><td>-</td><td>-</td><td>-</td><td>13.98 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>100597760</td><td>True</td><td>155.11 ms</td><td>3.077 ms</td><td>3.022 ms</td><td>155.77 ms</td><td>1.00</td><td>0.03</td><td>1000.0000</td><td>1000.0000</td><td>1000.0000</td><td>884163.71 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>100597760</td><td>True</td><td>6,883.67 ms</td><td>38.221 ms</td><td>35.752 ms</td><td>6,866.52 ms</td><td>44.39</td><td>0.89</td><td>-</td><td>-</td><td>-</td><td>779.4 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>100597760</td><td>True</td><td>197.39 ms</td><td>3.571 ms</td><td>3.340 ms</td><td>197.86 ms</td><td>1.27</td><td>0.03</td><td>-</td><td>-</td><td>-</td><td>13.96 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>209715200</td><td>False</td><td>254.51 ms</td><td>4.965 ms</td><td>5.313 ms</td><td>254.85 ms</td><td>1.00</td><td>0.03</td><td>1000.0000</td><td>1000.0000</td><td>1000.0000</td><td>1433603.27 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>209715200</td><td>False</td><td>11,080.87 ms</td><td>84.676 ms</td><td>79.206 ms</td><td>11,048.63 ms</td><td>43.56</td><td>0.95</td><td>-</td><td>-</td><td>-</td><td>1258.32 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>209715200</td><td>False</td><td>293.98 ms</td><td>7.749 ms</td><td>22.848 ms</td><td>298.86 ms</td><td>1.16</td><td>0.09</td><td>-</td><td>-</td><td>-</td><td>13.78 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>209715200</td><td>True</td><td>251.42 ms</td><td>3.941 ms</td><td>3.687 ms</td><td>251.85 ms</td><td>1.00</td><td>0.02</td><td>1000.0000</td><td>1000.0000</td><td>1000.0000</td><td>1433603.04 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>209715200</td><td>True</td><td>11,006.20 ms</td><td>10.644 ms</td><td>8.888 ms</td><td>11,006.01 ms</td><td>43.79</td><td>0.63</td><td>-</td><td>-</td><td>-</td><td>1257.17 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>209715200</td><td>True</td><td>300.30 ms</td><td>5.971 ms</td><td>15.624 ms</td><td>303.85 ms</td><td>1.19</td><td>0.06</td><td>-</td><td>-</td><td>-</td><td>13.78 KB</td><td>0.000</td>
+</thead><tbody><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>131072</td><td>False</td><td>False</td><td>97.21 ms</td><td>1.487 ms</td><td>1.391 ms</td><td>1.00</td><td>0.02</td><td>4000.0000</td><td>4000.0000</td><td>4000.0000</td><td>25244.37 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>131072</td><td>False</td><td>False</td><td>97.35 ms</td><td>1.708 ms</td><td>1.598 ms</td><td>1.00</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>48.96 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>131072</td><td>False</td><td>False</td><td>97.14 ms</td><td>1.292 ms</td><td>1.208 ms</td><td>1.00</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>54.63 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>131072</td><td>False</td><td>True</td><td>97.21 ms</td><td>1.500 ms</td><td>1.403 ms</td><td>1.00</td><td>0.02</td><td>4000.0000</td><td>4000.0000</td><td>4000.0000</td><td>12832.46 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>131072</td><td>False</td><td>True</td><td>97.09 ms</td><td>1.479 ms</td><td>1.384 ms</td><td>1.00</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>48.87 KB</td><td>0.004</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>131072</td><td>False</td><td>True</td><td>97.18 ms</td><td>1.426 ms</td><td>1.334 ms</td><td>1.00</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>54.53 KB</td><td>0.004</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>131072</td><td>True</td><td>False</td><td>97.14 ms</td><td>1.495 ms</td><td>1.399 ms</td><td>1.00</td><td>0.02</td><td>4000.0000</td><td>4000.0000</td><td>4000.0000</td><td>12832.65 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>131072</td><td>True</td><td>False</td><td>97.27 ms</td><td>1.422 ms</td><td>1.330 ms</td><td>1.00</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>48.94 KB</td><td>0.004</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>131072</td><td>True</td><td>False</td><td>97.65 ms</td><td>1.478 ms</td><td>1.383 ms</td><td>1.01</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>54.73 KB</td><td>0.004</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>131072</td><td>True</td><td>True</td><td>97.37 ms</td><td>1.273 ms</td><td>1.191 ms</td><td>1.00</td><td>0.02</td><td>4000.0000</td><td>4000.0000</td><td>4000.0000</td><td>12832.56 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>131072</td><td>True</td><td>True</td><td>97.20 ms</td><td>1.403 ms</td><td>1.312 ms</td><td>1.00</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>48.87 KB</td><td>0.004</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>131072</td><td>True</td><td>True</td><td>97.36 ms</td><td>1.917 ms</td><td>1.793 ms</td><td>1.00</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>54.43 KB</td><td>0.004</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>983040</td><td>False</td><td>False</td><td>51.52 ms</td><td>0.231 ms</td><td>0.180 ms</td><td>1.00</td><td>0.00</td><td>21700.0000</td><td>21400.0000</td><td>21400.0000</td><td>108382.09 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>983040</td><td>False</td><td>False</td><td>413.00 ms</td><td>7.802 ms</td><td>8.012 ms</td><td>8.02</td><td>0.15</td><td>-</td><td>-</td><td>-</td><td>99.86 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>983040</td><td>False</td><td>False</td><td>154.37 ms</td><td>2.038 ms</td><td>1.806 ms</td><td>3.00</td><td>0.04</td><td>-</td><td>-</td><td>-</td><td>45.49 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>983040</td><td>False</td><td>True</td><td>51.89 ms</td><td>0.772 ms</td><td>0.722 ms</td><td>1.00</td><td>0.02</td><td>10200.0000</td><td>10200.0000</td><td>10200.0000</td><td>50918.65 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>983040</td><td>False</td><td>True</td><td>412.55 ms</td><td>8.095 ms</td><td>8.313 ms</td><td>7.95</td><td>0.19</td><td>-</td><td>-</td><td>-</td><td>82.14 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>983040</td><td>False</td><td>True</td><td>51.32 ms</td><td>0.213 ms</td><td>0.178 ms</td><td>0.99</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>28.89 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>983040</td><td>True</td><td>False</td><td>51.49 ms</td><td>0.155 ms</td><td>0.129 ms</td><td>1.00</td><td>0.00</td><td>9900.0000</td><td>9900.0000</td><td>9900.0000</td><td>50912.75 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>983040</td><td>True</td><td>False</td><td>412.82 ms</td><td>7.923 ms</td><td>7.411 ms</td><td>8.02</td><td>0.14</td><td>-</td><td>-</td><td>-</td><td>81.23 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>983040</td><td>True</td><td>False</td><td>51.40 ms</td><td>0.372 ms</td><td>0.311 ms</td><td>1.00</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>29.06 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>983040</td><td>True</td><td>True</td><td>51.45 ms</td><td>0.259 ms</td><td>0.202 ms</td><td>1.00</td><td>0.01</td><td>10000.0000</td><td>10000.0000</td><td>10000.0000</td><td>50913.69 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>983040</td><td>True</td><td>True</td><td>412.19 ms</td><td>8.038 ms</td><td>8.255 ms</td><td>8.01</td><td>0.16</td><td>-</td><td>-</td><td>-</td><td>80.81 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>983040</td><td>True</td><td>True</td><td>51.33 ms</td><td>0.190 ms</td><td>0.159 ms</td><td>1.00</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>28.89 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>16777216</td><td>False</td><td>False</td><td>123.56 ms</td><td>2.467 ms</td><td>6.369 ms</td><td>1.00</td><td>0.07</td><td>14250.0000</td><td>14250.0000</td><td>14250.0000</td><td>589770.58 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>16777216</td><td>False</td><td>False</td><td>2,243.11 ms</td><td>4.153 ms</td><td>3.885 ms</td><td>18.20</td><td>0.98</td><td>-</td><td>-</td><td>-</td><td>1484.61 KB</td><td>0.003</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>16777216</td><td>False</td><td>False</td><td>122.55 ms</td><td>1.575 ms</td><td>1.473 ms</td><td>0.99</td><td>0.05</td><td>-</td><td>-</td><td>-</td><td>22.4 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>16777216</td><td>False</td><td>True</td><td>62.10 ms</td><td>1.228 ms</td><td>2.797 ms</td><td>1.00</td><td>0.06</td><td>2666.6667</td><td>2666.6667</td><td>2666.6667</td><td>294919.89 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>16777216</td><td>False</td><td>True</td><td>2,242.24 ms</td><td>4.267 ms</td><td>3.991 ms</td><td>36.18</td><td>1.62</td><td>-</td><td>-</td><td>-</td><td>270.73 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>16777216</td><td>False</td><td>True</td><td>105.10 ms</td><td>1.454 ms</td><td>1.214 ms</td><td>1.70</td><td>0.08</td><td>-</td><td>-</td><td>-</td><td>20.95 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>16777216</td><td>True</td><td>False</td><td>59.31 ms</td><td>1.180 ms</td><td>3.024 ms</td><td>1.00</td><td>0.07</td><td>3888.8889</td><td>3888.8889</td><td>3888.8889</td><td>294919.96 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>16777216</td><td>True</td><td>False</td><td>2,241.13 ms</td><td>2.941 ms</td><td>2.751 ms</td><td>37.88</td><td>1.88</td><td>-</td><td>-</td><td>-</td><td>270.17 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>16777216</td><td>True</td><td>False</td><td>105.09 ms</td><td>1.351 ms</td><td>1.264 ms</td><td>1.78</td><td>0.09</td><td>-</td><td>-</td><td>-</td><td>21.22 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>16777216</td><td>True</td><td>True</td><td>63.68 ms</td><td>1.273 ms</td><td>2.899 ms</td><td>1.00</td><td>0.06</td><td>2250.0000</td><td>2250.0000</td><td>2250.0000</td><td>294920.91 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>16777216</td><td>True</td><td>True</td><td>2,242.01 ms</td><td>2.668 ms</td><td>2.496 ms</td><td>35.28</td><td>1.59</td><td>-</td><td>-</td><td>-</td><td>269.42 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>16777216</td><td>True</td><td>True</td><td>105.37 ms</td><td>1.098 ms</td><td>0.917 ms</td><td>1.66</td><td>0.08</td><td>-</td><td>-</td><td>-</td><td>20.92 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>100597760</td><td>False</td><td>False</td><td>365.85 ms</td><td>6.980 ms</td><td>7.168 ms</td><td>1.00</td><td>0.03</td><td>5000.0000</td><td>5000.0000</td><td>5000.0000</td><td>2359269.8 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>100597760</td><td>False</td><td>False</td><td>6,855.08 ms</td><td>13.537 ms</td><td>12.663 ms</td><td>18.74</td><td>0.36</td><td>1000.0000</td><td>-</td><td>-</td><td>21650.17 KB</td><td>0.009</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>100597760</td><td>False</td><td>False</td><td>227.83 ms</td><td>1.799 ms</td><td>1.682 ms</td><td>0.62</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>15.63 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>100597760</td><td>False</td><td>True</td><td>158.88 ms</td><td>2.336 ms</td><td>1.951 ms</td><td>1.00</td><td>0.02</td><td>1500.0000</td><td>1500.0000</td><td>1500.0000</td><td>884163.94 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>100597760</td><td>False</td><td>True</td><td>6,866.32 ms</td><td>4.994 ms</td><td>4.427 ms</td><td>43.22</td><td>0.51</td><td>-</td><td>-</td><td>-</td><td>780.08 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>100597760</td><td>False</td><td>True</td><td>194.68 ms</td><td>3.563 ms</td><td>3.333 ms</td><td>1.23</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>14.1 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>100597760</td><td>True</td><td>False</td><td>167.47 ms</td><td>3.293 ms</td><td>3.081 ms</td><td>1.00</td><td>0.03</td><td>1666.6667</td><td>1666.6667</td><td>1666.6667</td><td>884163.99 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>100597760</td><td>True</td><td>False</td><td>6,819.94 ms</td><td>22.623 ms</td><td>20.055 ms</td><td>40.74</td><td>0.75</td><td>-</td><td>-</td><td>-</td><td>779.05 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>100597760</td><td>True</td><td>False</td><td>195.53 ms</td><td>3.857 ms</td><td>4.127 ms</td><td>1.17</td><td>0.03</td><td>-</td><td>-</td><td>-</td><td>14.23 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>100597760</td><td>True</td><td>True</td><td>159.22 ms</td><td>0.974 ms</td><td>0.813 ms</td><td>1.00</td><td>0.01</td><td>1750.0000</td><td>1750.0000</td><td>1750.0000</td><td>884164.07 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>100597760</td><td>True</td><td>True</td><td>6,870.64 ms</td><td>3.764 ms</td><td>3.337 ms</td><td>43.15</td><td>0.21</td><td>-</td><td>-</td><td>-</td><td>780.04 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>100597760</td><td>True</td><td>True</td><td>193.42 ms</td><td>3.186 ms</td><td>2.980 ms</td><td>1.21</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>14.1 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>209715200</td><td>False</td><td>False</td><td>528.07 ms</td><td>7.478 ms</td><td>6.995 ms</td><td>1.00</td><td>0.02</td><td>3000.0000</td><td>3000.0000</td><td>3000.0000</td><td>3669995.33 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>209715200</td><td>False</td><td>False</td><td>11,011.70 ms</td><td>6.434 ms</td><td>6.018 ms</td><td>20.86</td><td>0.27</td><td>3000.0000</td><td>-</td><td>-</td><td>71563.52 KB</td><td>0.019</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>209715200</td><td>False</td><td>False</td><td>341.75 ms</td><td>2.868 ms</td><td>2.683 ms</td><td>0.65</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>14.34 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>209715200</td><td>False</td><td>True</td><td>240.95 ms</td><td>3.243 ms</td><td>3.033 ms</td><td>1.00</td><td>0.02</td><td>1000.0000</td><td>1000.0000</td><td>1000.0000</td><td>1433603.27 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>209715200</td><td>False</td><td>True</td><td>11,016.41 ms</td><td>11.702 ms</td><td>10.373 ms</td><td>45.73</td><td>0.57</td><td>-</td><td>-</td><td>-</td><td>1257.58 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>209715200</td><td>False</td><td>True</td><td>313.58 ms</td><td>6.013 ms</td><td>6.175 ms</td><td>1.30</td><td>0.03</td><td>-</td><td>-</td><td>-</td><td>13.89 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>209715200</td><td>True</td><td>False</td><td>257.98 ms</td><td>5.115 ms</td><td>5.023 ms</td><td>1.00</td><td>0.03</td><td>1000.0000</td><td>1000.0000</td><td>1000.0000</td><td>1433603.16 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>209715200</td><td>True</td><td>False</td><td>11,014.72 ms</td><td>10.105 ms</td><td>9.452 ms</td><td>42.71</td><td>0.82</td><td>-</td><td>-</td><td>-</td><td>1258.28 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>209715200</td><td>True</td><td>False</td><td>328.06 ms</td><td>1.504 ms</td><td>1.407 ms</td><td>1.27</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>13.95 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream CopyToAsync&#39;</td><td>209715200</td><td>True</td><td>True</td><td>241.43 ms</td><td>2.493 ms</td><td>2.332 ms</td><td>1.00</td><td>0.01</td><td>1000.0000</td><td>1000.0000</td><td>1000.0000</td><td>1433603.01 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream CopyToAsync&#39;</td><td>209715200</td><td>True</td><td>True</td><td>11,012.98 ms</td><td>7.765 ms</td><td>6.883 ms</td><td>45.62</td><td>0.43</td><td>-</td><td>-</td><td>-</td><td>1257.04 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim CopyToAsync&#39;</td><td>209715200</td><td>True</td><td>True</td><td>309.68 ms</td><td>6.123 ms</td><td>14.191 ms</td><td>1.28</td><td>0.06</td><td>-</td><td>-</td><td>-</td><td>13.89 KB</td><td>0.000</td>
 </tr></tbody></table>
 </body>
 </html>
diff --git a/Source/Docs/articles/MemoryStreamBenchmarks.SegmentedFillAndReadThroughputBenchmarks-report-github.md b/Source/Docs/articles/MemoryStreamBenchmarks.SegmentedFillAndReadThroughputBenchmarks-report-github.md
index 7463dcb..e568f94 100644
--- a/Source/Docs/articles/MemoryStreamBenchmarks.SegmentedFillAndReadThroughputBenchmarks-report-github.md
+++ b/Source/Docs/articles/MemoryStreamBenchmarks.SegmentedFillAndReadThroughputBenchmarks-report-github.md
@@ -8,164 +8,164 @@ Intel Core i9-14900K, 1 CPU, 32 logical and 24 physical cores
 
 
 ```
-| Method                                           | DataSize  | CapacityOnCreate | ZeroBuffers | GrowEachLoop | Mean       | Error     | StdDev    | Median     | Ratio | RatioSD | Gen0       | Gen1       | Gen2       | Allocated     | Alloc Ratio |
-|------------------------------------------------- |---------- |----------------- |------------ |------------- |-----------:|----------:|----------:|-----------:|------:|--------:|-----------:|-----------:|-----------:|--------------:|------------:|
-| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **False**            | **False**       | **False**        |  **21.818 ms** | **0.0748 ms** | **0.0624 ms** |  **21.817 ms** |  **1.00** |    **0.00** | **21109.3750** | **21109.3750** | **21109.3750** |  **127873.92 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | False            | False       | False        |   1.457 ms | 0.0278 ms | 0.0232 ms |   1.445 ms |  0.07 |    0.00 |     5.8594 |          - |          - |     138.63 KB |       0.001 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | False            | False       | False        |   1.897 ms | 0.0098 ms | 0.0091 ms |   1.893 ms |  0.09 |    0.00 |     5.8594 |          - |          - |     142.59 KB |       0.001 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **False**            | **False**       | **True**         |  **52.135 ms** | **0.2502 ms** | **0.2340 ms** |  **52.187 ms** |  **1.00** |    **0.01** | **63234.3750** | **63234.3750** | **63234.3750** |   **257435.6 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | False            | False       | True         |   2.142 ms | 0.0078 ms | 0.0070 ms |   2.140 ms |  0.04 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.001 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | False            | False       | True         |   2.563 ms | 0.0145 ms | 0.0135 ms |   2.566 ms |  0.05 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.001 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **False**            | **True**        | **False**        |  **21.755 ms** | **0.1837 ms** | **0.1718 ms** |  **21.764 ms** |  **1.00** |    **0.01** | **21109.3750** | **21109.3750** | **21109.3750** |  **127873.92 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | False            | True        | False        |   2.114 ms | 0.0194 ms | 0.0182 ms |   2.119 ms |  0.10 |    0.00 |     3.9063 |          - |          - |     138.63 KB |       0.001 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | False            | True        | False        |   3.205 ms | 0.0223 ms | 0.0208 ms |   3.202 ms |  0.15 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.001 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **False**            | **True**        | **True**         |  **52.269 ms** | **0.2089 ms** | **0.1954 ms** |  **52.304 ms** |  **1.00** |    **0.01** | **63234.3750** | **63234.3750** | **63234.3750** |   **257435.6 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | False            | True        | True         |   3.421 ms | 0.0232 ms | 0.0206 ms |   3.423 ms |  0.07 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.001 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | False            | True        | True         |   4.630 ms | 0.0489 ms | 0.0458 ms |   4.613 ms |  0.09 |    0.00 |          - |          - |          - |      142.6 KB |       0.001 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **True**             | **False**       | **False**        |  **18.686 ms** | **0.0997 ms** | **0.0933 ms** |  **18.712 ms** |  **1.00** |    **0.01** | **21117.1875** | **21117.1875** | **21117.1875** |    **64946.5 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | True             | False       | False        |   1.448 ms | 0.0071 ms | 0.0067 ms |   1.447 ms |  0.08 |    0.00 |     5.8594 |          - |          - |     138.63 KB |       0.002 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | True             | False       | False        |   1.331 ms | 0.0075 ms | 0.0070 ms |   1.331 ms |  0.07 |    0.00 |     5.8594 |          - |          - |     142.59 KB |       0.002 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **True**             | **False**       | **True**         |  **27.830 ms** | **0.1134 ms** | **0.1005 ms** |  **27.847 ms** |  **1.00** |    **0.00** | **30570.3125** | **30570.3125** | **30570.3125** |   **97017.35 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | True             | False       | True         |   2.135 ms | 0.0052 ms | 0.0046 ms |   2.136 ms |  0.08 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.002 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | True             | False       | True         |   2.058 ms | 0.0063 ms | 0.0056 ms |   2.060 ms |  0.07 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.001 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **True**             | **True**        | **False**        |  **18.645 ms** | **0.1465 ms** | **0.1370 ms** |  **18.614 ms** |  **1.00** |    **0.01** | **21117.1875** | **21117.1875** | **21117.1875** |    **64946.5 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | True             | True        | False        |   2.111 ms | 0.0196 ms | 0.0184 ms |   2.116 ms |  0.11 |    0.00 |     3.9063 |          - |          - |     138.63 KB |       0.002 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | True             | True        | False        |   2.164 ms | 0.0139 ms | 0.0130 ms |   2.165 ms |  0.12 |    0.00 |     3.9063 |          - |          - |     142.59 KB |       0.002 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **True**             | **True**        | **True**         |  **27.944 ms** | **0.1775 ms** | **0.1661 ms** |  **27.942 ms** |  **1.00** |    **0.01** | **30570.3125** | **30570.3125** | **30570.3125** |   **97017.35 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | True             | True        | True         |   3.543 ms | 0.0332 ms | 0.0294 ms |   3.544 ms |  0.13 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.002 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | True             | True        | True         |   3.324 ms | 0.0417 ms | 0.0390 ms |   3.328 ms |  0.12 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.001 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **False**            | **False**       | **False**        |  **84.527 ms** | **0.4030 ms** | **0.3770 ms** |  **84.577 ms** |  **1.00** |    **0.01** | **77968.7500** | **77968.7500** | **77968.7500** |  **318932.25 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | False            | False       | False        |   3.171 ms | 0.0138 ms | 0.0129 ms |   3.169 ms |  0.04 |    0.00 |     3.9063 |          - |          - |     138.94 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | False            | False       | False        |   3.524 ms | 0.0087 ms | 0.0081 ms |   3.524 ms |  0.04 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **False**            | **False**       | **True**         |  **85.581 ms** | **0.8009 ms** | **0.7099 ms** |  **85.623 ms** |  **1.00** |    **0.01** | **77968.7500** | **77968.7500** | **77968.7500** |  **318932.25 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | False            | False       | True         |   3.207 ms | 0.0069 ms | 0.0061 ms |   3.209 ms |  0.04 |    0.00 |     3.9063 |          - |          - |     138.94 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | False            | False       | True         |   3.577 ms | 0.0129 ms | 0.0114 ms |   3.578 ms |  0.04 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **False**            | **True**        | **False**        |  **84.685 ms** | **0.4057 ms** | **0.3597 ms** |  **84.760 ms** |  **1.00** |    **0.01** | **77968.7500** | **77968.7500** | **77968.7500** |  **318932.25 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | False            | True        | False        |   4.947 ms | 0.0554 ms | 0.0518 ms |   4.942 ms |  0.06 |    0.00 |          - |          - |          - |     138.94 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | False            | True        | False        |   5.568 ms | 0.0569 ms | 0.0532 ms |   5.581 ms |  0.07 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **False**            | **True**        | **True**         |  **85.896 ms** | **0.3737 ms** | **0.3495 ms** |  **85.885 ms** |  **1.00** |    **0.01** | **77968.7500** | **77968.7500** | **77968.7500** |  **318932.25 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | False            | True        | True         |   4.963 ms | 0.0347 ms | 0.0307 ms |   4.958 ms |  0.06 |    0.00 |          - |          - |          - |     138.94 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | False            | True        | True         |   5.657 ms | 0.0212 ms | 0.0199 ms |   5.656 ms |  0.07 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **True**             | **False**       | **False**        |  **42.690 ms** | **0.3922 ms** | **0.3669 ms** |  **42.719 ms** |  **1.00** |    **0.01** | **38984.3750** | **38984.3750** | **38984.3750** |   **149786.2 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | True             | False       | False        |   3.148 ms | 0.0120 ms | 0.0112 ms |   3.147 ms |  0.07 |    0.00 |     3.9063 |          - |          - |       84.1 KB |       0.001 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | True             | False       | False        |   2.804 ms | 0.0117 ms | 0.0110 ms |   2.803 ms |  0.07 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **True**             | **False**       | **True**         |  **44.404 ms** | **0.5078 ms** | **0.4750 ms** |  **44.420 ms** |  **1.00** |    **0.01** | **38968.7500** | **38968.7500** | **38968.7500** |  **152808.71 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | True             | False       | True         |   3.204 ms | 0.0061 ms | 0.0051 ms |   3.204 ms |  0.07 |    0.00 |     3.9063 |          - |          - |       84.1 KB |       0.001 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | True             | False       | True         |   3.114 ms | 0.0115 ms | 0.0108 ms |   3.116 ms |  0.07 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **True**             | **True**        | **False**        |  **42.477 ms** | **0.3080 ms** | **0.2881 ms** |  **42.409 ms** |  **1.00** |    **0.01** | **38984.3750** | **38984.3750** | **38984.3750** |   **149786.2 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | True             | True        | False        |   4.987 ms | 0.0500 ms | 0.0467 ms |   4.972 ms |  0.12 |    0.00 |          - |          - |          - |       84.1 KB |       0.001 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | True             | True        | False        |   4.748 ms | 0.0643 ms | 0.0601 ms |   4.720 ms |  0.11 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **True**             | **True**        | **True**         |  **43.683 ms** | **0.3936 ms** | **0.3681 ms** |  **43.610 ms** |  **1.00** |    **0.01** | **38968.7500** | **38968.7500** | **38968.7500** |  **152808.71 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | True             | True        | True         |   4.954 ms | 0.0515 ms | 0.0482 ms |   4.936 ms |  0.11 |    0.00 |          - |          - |          - |      84.09 KB |       0.001 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | True             | True        | True         |   4.891 ms | 0.0628 ms | 0.0588 ms |   4.870 ms |  0.11 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **False**            | **False**       | **False**        | **193.863 ms** | **3.8742 ms** | **9.6481 ms** | **196.459 ms** |  **1.00** |    **0.08** | **43250.0000** | **43250.0000** | **43250.0000** |   **950180.6 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | False            | False       | False        |  15.469 ms | 0.1974 ms | 0.1750 ms |  15.420 ms |  0.08 |    0.00 |   109.3750 |          - |          - |     2108.4 KB |       0.002 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | False            | False       | False        |  16.877 ms | 0.2989 ms | 0.2796 ms |  16.834 ms |  0.09 |    0.01 |          - |          - |          - |       8.17 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **False**            | **False**       | **True**         | **269.748 ms** | **4.9505 ms** | **4.8620 ms** | **269.403 ms** |  **1.00** |    **0.02** | **15500.0000** | **15500.0000** | **15500.0000** | **1867676.29 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | False            | False       | True         |  15.570 ms | 0.3009 ms | 0.2955 ms |  15.481 ms |  0.06 |    0.00 |   109.3750 |          - |          - |    2109.27 KB |       0.001 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | False            | False       | True         |  16.778 ms | 0.3248 ms | 0.4224 ms |  16.624 ms |  0.06 |    0.00 |          - |          - |          - |       8.17 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **False**            | **True**        | **False**        | **194.253 ms** | **3.8411 ms** | **9.5657 ms** | **196.748 ms** |  **1.00** |    **0.08** | **42500.0000** | **42500.0000** | **42500.0000** |  **950180.35 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | False            | True        | False        |  23.406 ms | 0.1085 ms | 0.0962 ms |  23.371 ms |  0.12 |    0.01 |    93.7500 |          - |          - |     2108.4 KB |       0.002 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | False            | True        | False        |  26.900 ms | 0.5338 ms | 0.4993 ms |  26.719 ms |  0.14 |    0.01 |          - |          - |          - |       8.17 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **False**            | **True**        | **True**         | **270.081 ms** | **5.3656 ms** | **5.7412 ms** | **270.275 ms** |  **1.00** |    **0.03** | **15500.0000** | **15500.0000** | **15500.0000** |  **1867676.3 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | False            | True        | True         |  25.286 ms | 0.4909 ms | 0.5252 ms |  25.388 ms |  0.09 |    0.00 |    93.7500 |          - |          - |    2109.28 KB |       0.001 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | False            | True        | True         |  26.941 ms | 0.5307 ms | 0.8105 ms |  26.767 ms |  0.10 |    0.00 |          - |          - |          - |       8.17 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **True**             | **False**       | **False**        | **114.673 ms** | **2.2574 ms** | **4.7616 ms** | **115.690 ms** |  **1.00** |    **0.06** | **19200.0000** | **19200.0000** | **19200.0000** |  **475144.65 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | True             | False       | False        |  15.223 ms | 0.2763 ms | 0.2450 ms |  15.151 ms |  0.13 |    0.01 |          - |          - |          - |      151.8 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | True             | False       | False        |  14.514 ms | 0.2308 ms | 0.1927 ms |  14.559 ms |  0.13 |    0.01 |          - |          - |          - |       8.16 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **True**             | **False**       | **True**         | **114.857 ms** | **1.7035 ms** | **1.5934 ms** | **114.879 ms** |  **1.00** |    **0.02** | **19000.0000** | **19000.0000** | **19000.0000** |  **475246.06 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | True             | False       | True         |  14.932 ms | 0.0879 ms | 0.0734 ms |  14.917 ms |  0.13 |    0.00 |          - |          - |          - |     152.68 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | True             | False       | True         |  14.810 ms | 0.2921 ms | 0.5341 ms |  14.658 ms |  0.13 |    0.00 |          - |          - |          - |       8.16 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **True**             | **True**        | **False**        | **115.381 ms** | **2.2486 ms** | **2.1033 ms** | **116.344 ms** |  **1.00** |    **0.03** | **19166.6667** | **19166.6667** | **19166.6667** |  **475144.62 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | True             | True        | False        |  23.594 ms | 0.3234 ms | 0.2867 ms |  23.519 ms |  0.20 |    0.00 |          - |          - |          - |     151.81 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | True             | True        | False        |  22.897 ms | 0.3121 ms | 0.2920 ms |  22.911 ms |  0.20 |    0.00 |          - |          - |          - |       8.17 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **True**             | **True**        | **True**         | **114.824 ms** | **2.2571 ms** | **3.7712 ms** | **115.313 ms** |  **1.00** |    **0.05** | **19000.0000** | **19000.0000** | **19000.0000** |  **475246.06 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | True             | True        | True         |  24.117 ms | 0.3192 ms | 0.2985 ms |  24.161 ms |  0.21 |    0.01 |          - |          - |          - |     152.68 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | True             | True        | True         |  23.210 ms | 0.4412 ms | 0.4127 ms |  23.203 ms |  0.20 |    0.01 |          - |          - |          - |       8.17 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **False**            | **False**       | **False**        | **366.433 ms** | **5.9572 ms** | **5.5724 ms** | **367.650 ms** |  **1.00** |    **0.02** |  **9000.0000** |  **9000.0000** |  **9000.0000** | **2621407.65 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | False            | False       | False        |  92.110 ms | 1.3932 ms | 1.0877 ms |  91.998 ms |  0.25 |    0.00 |  1166.6667 |          - |          - |   23491.78 KB |       0.009 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | False            | False       | False        |  94.915 ms | 0.8429 ms | 0.7472 ms |  94.748 ms |  0.26 |    0.00 |          - |          - |          - |       2.88 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **False**            | **False**       | **True**         | **357.067 ms** | **4.9853 ms** | **4.6633 ms** | **355.916 ms** |  **1.00** |    **0.02** |  **9000.0000** |  **9000.0000** |  **9000.0000** | **2621407.65 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | False            | False       | True         |  92.640 ms | 1.8444 ms | 2.7035 ms |  91.084 ms |  0.26 |    0.01 |  1166.6667 |          - |          - |   23491.78 KB |       0.009 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | False            | False       | True         |  98.770 ms | 1.8018 ms | 2.7515 ms |  98.336 ms |  0.28 |    0.01 |          - |          - |          - |       2.89 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **False**            | **True**        | **False**        | **362.133 ms** | **7.0007 ms** | **6.5485 ms** | **362.841 ms** |  **1.00** |    **0.02** |  **9000.0000** |  **9000.0000** |  **9000.0000** | **2621407.65 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | False            | True        | False        | 140.978 ms | 2.7449 ms | 2.5676 ms | 140.219 ms |  0.39 |    0.01 |  1250.0000 |          - |          - |   23491.82 KB |       0.009 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | False            | True        | False        | 146.386 ms | 2.8204 ms | 3.6674 ms | 146.295 ms |  0.40 |    0.01 |          - |          - |          - |       2.91 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **False**            | **True**        | **True**         | **357.148 ms** | **6.1035 ms** | **5.7092 ms** | **355.354 ms** |  **1.00** |    **0.02** |  **9000.0000** |  **9000.0000** |  **9000.0000** | **2621407.65 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | False            | True        | True         | 140.035 ms | 1.0850 ms | 1.0149 ms | 139.720 ms |  0.39 |    0.01 |  1250.0000 |          - |          - |   23491.82 KB |       0.009 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | False            | True        | True         | 146.910 ms | 2.8930 ms | 3.8621 ms | 146.415 ms |  0.41 |    0.01 |          - |          - |          - |       2.91 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **True**             | **False**       | **False**        | **161.084 ms** | **3.1575 ms** | **4.7261 ms** | **160.482 ms** |  **1.00** |    **0.04** |  **9750.0000** |  **9750.0000** |  **9750.0000** |  **982404.16 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | True             | False       | False        |  88.737 ms | 1.2786 ms | 1.1335 ms |  88.278 ms |  0.55 |    0.02 |          - |          - |          - |     302.33 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | True             | False       | False        |  91.863 ms | 1.7380 ms | 1.7848 ms |  91.370 ms |  0.57 |    0.02 |          - |          - |          - |       2.88 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **True**             | **False**       | **True**         | **158.744 ms** | **3.0900 ms** | **4.6250 ms** | **158.399 ms** |  **1.00** |    **0.04** |  **9750.0000** |  **9750.0000** |  **9750.0000** |  **982415.34 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | True             | False       | True         |  88.183 ms | 0.7793 ms | 0.6084 ms |  88.038 ms |  0.56 |    0.02 |          - |          - |          - |     302.33 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | True             | False       | True         |  94.749 ms | 1.8767 ms | 3.1868 ms |  93.501 ms |  0.60 |    0.03 |          - |          - |          - |       2.88 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **True**             | **True**        | **False**        | **157.669 ms** | **3.1134 ms** | **4.7546 ms** | **158.013 ms** |  **1.00** |    **0.04** |  **9666.6667** |  **9666.6667** |  **9666.6667** |  **982404.16 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | True             | True        | False        | 138.744 ms | 2.4134 ms | 2.2575 ms | 138.389 ms |  0.88 |    0.03 |          - |          - |          - |     302.36 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | True             | True        | False        | 140.889 ms | 2.6854 ms | 3.2979 ms | 140.053 ms |  0.89 |    0.03 |          - |          - |          - |       2.91 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **True**             | **True**        | **True**         | **159.337 ms** | **3.1719 ms** | **5.2996 ms** | **157.928 ms** |  **1.00** |    **0.05** |  **9666.6667** |  **9666.6667** |  **9666.6667** |  **982415.41 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | True             | True        | True         | 137.265 ms | 1.5373 ms | 1.4380 ms | 137.261 ms |  0.86 |    0.03 |          - |          - |          - |     302.36 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | True             | True        | True         | 137.525 ms | 2.0125 ms | 1.7840 ms | 138.165 ms |  0.86 |    0.03 |          - |          - |          - |       2.91 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **False**            | **False**       | **False**        | **438.707 ms** | **7.0014 ms** | **8.3347 ms** | **440.511 ms** |  **1.00** |    **0.03** |  **8000.0000** |  **8000.0000** |  **8000.0000** | **3145709.73 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | False            | False       | False        | 126.947 ms | 2.4891 ms | 3.4070 ms | 126.118 ms |  0.29 |    0.01 |  3250.0000 |   250.0000 |          - |   60638.73 KB |       0.019 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | False            | False       | False        | 133.258 ms | 2.6608 ms | 4.2966 ms | 132.723 ms |  0.30 |    0.01 |          - |          - |          - |       1.79 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **False**            | **False**       | **True**         | **433.728 ms** | **6.4141 ms** | **5.9998 ms** | **432.459 ms** |  **1.00** |    **0.02** |  **8000.0000** |  **8000.0000** |  **8000.0000** | **3145709.73 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | False            | False       | True         | 124.880 ms | 1.8325 ms | 1.5303 ms | 124.496 ms |  0.29 |    0.01 |  3250.0000 |   250.0000 |          - |    60638.9 KB |       0.019 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | False            | False       | True         | 129.577 ms | 2.1441 ms | 2.0056 ms | 129.419 ms |  0.30 |    0.01 |          - |          - |          - |       1.79 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **False**            | **True**        | **False**        | **433.458 ms** | **6.5821 ms** | **6.1569 ms** | **432.431 ms** |  **1.00** |    **0.02** |  **8000.0000** |  **8000.0000** |  **8000.0000** | **3145709.73 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | False            | True        | False        | 190.585 ms | 3.4892 ms | 3.2638 ms | 190.768 ms |  0.44 |    0.01 |  3000.0000 |   333.3333 |          - |   60638.85 KB |       0.019 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | False            | True        | False        | 202.791 ms | 3.8677 ms | 3.7986 ms | 203.203 ms |  0.47 |    0.01 |          - |          - |          - |       1.82 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **False**            | **True**        | **True**         | **430.366 ms** | **5.4365 ms** | **4.8193 ms** | **430.323 ms** |  **1.00** |    **0.02** |  **8000.0000** |  **8000.0000** |  **8000.0000** | **3145709.73 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | False            | True        | True         | 189.047 ms | 2.7878 ms | 2.6077 ms | 188.422 ms |  0.44 |    0.01 |  3000.0000 |   333.3333 |          - |      60639 KB |       0.019 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | False            | True        | True         | 201.289 ms | 3.8767 ms | 3.9811 ms | 200.748 ms |  0.47 |    0.01 |          - |          - |          - |       1.82 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **True**             | **False**       | **False**        | **198.306 ms** | **3.8255 ms** | **3.5784 ms** | **199.363 ms** |  **1.00** |    **0.03** |  **5666.6667** |  **5666.6667** |  **5666.6667** |  **1228802.5 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | True             | False       | False        | 118.411 ms | 0.9403 ms | 0.7852 ms | 118.298 ms |  0.60 |    0.01 |          - |          - |          - |     376.48 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | True             | False       | False        | 122.601 ms | 1.0538 ms | 0.9342 ms | 122.635 ms |  0.62 |    0.01 |          - |          - |          - |       1.79 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **True**             | **False**       | **True**         | **203.360 ms** | **4.0109 ms** | **5.7524 ms** | **202.017 ms** |  **1.00** |    **0.04** |  **5666.6667** |  **5666.6667** |  **5666.6667** | **1228806.25 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | True             | False       | True         | 123.899 ms | 2.4639 ms | 3.8359 ms | 124.157 ms |  0.61 |    0.03 |          - |          - |          - |     376.66 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | True             | False       | True         | 124.416 ms | 2.3794 ms | 2.1093 ms | 123.583 ms |  0.61 |    0.02 |          - |          - |          - |       1.79 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **True**             | **True**        | **False**        | **203.558 ms** | **4.0339 ms** | **5.6549 ms** | **202.606 ms** |  **1.00** |    **0.04** |  **5666.6667** |  **5666.6667** |  **5666.6667** | **1228802.41 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | True             | True        | False        | 184.637 ms | 2.0636 ms | 1.8293 ms | 184.295 ms |  0.91 |    0.03 |          - |          - |          - |     376.54 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | True             | True        | False        | 186.651 ms | 1.9620 ms | 1.8353 ms | 186.186 ms |  0.92 |    0.03 |          - |          - |          - |       1.82 KB |       0.000 |
-|                                                  |           |                  |             |              |            |           |           |            |       |         |            |            |            |               |             |
-| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **True**             | **True**        | **True**         | **200.762 ms** | **3.0647 ms** | **2.8668 ms** | **200.881 ms** |  **1.00** |    **0.02** |  **5666.6667** |  **5666.6667** |  **5666.6667** | **1228806.25 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | True             | True        | True         | 187.238 ms | 3.6100 ms | 4.2974 ms | 188.407 ms |  0.93 |    0.02 |          - |          - |          - |     376.69 KB |       0.000 |
-| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | True             | True        | True         | 189.451 ms | 3.3189 ms | 2.9421 ms | 189.858 ms |  0.94 |    0.02 |          - |          - |          - |       1.82 KB |       0.000 |
+| Method                                           | DataSize  | CapacityOnCreate | ZeroBuffers | GrowEachLoop | Mean       | Error     | StdDev     | Ratio | RatioSD | Gen0       | Gen1       | Gen2       | Allocated     | Alloc Ratio |
+|------------------------------------------------- |---------- |----------------- |------------ |------------- |-----------:|----------:|-----------:|------:|--------:|-----------:|-----------:|-----------:|--------------:|------------:|
+| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **False**            | **False**       | **False**        |  **22.183 ms** | **0.1438 ms** |  **0.1345 ms** |  **1.00** |    **0.01** | **21109.3750** | **21109.3750** | **21109.3750** |  **127873.92 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | False            | False       | False        |   1.458 ms | 0.0091 ms |  0.0085 ms |  0.07 |    0.00 |     5.8594 |          - |          - |     138.63 KB |       0.001 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | False            | False       | False        |   1.981 ms | 0.0094 ms |  0.0078 ms |  0.09 |    0.00 |     5.8594 |          - |          - |     142.59 KB |       0.001 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **False**            | **False**       | **True**         |  **53.109 ms** | **0.2264 ms** |  **0.2117 ms** |  **1.00** |    **0.01** | **63234.3750** | **63234.3750** | **63234.3750** |   **257435.6 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | False            | False       | True         |   2.125 ms | 0.0079 ms |  0.0074 ms |  0.04 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.001 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | False            | False       | True         |   2.692 ms | 0.0097 ms |  0.0086 ms |  0.05 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.001 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **False**            | **True**        | **False**        |  **22.171 ms** | **0.1282 ms** |  **0.1071 ms** |  **1.00** |    **0.01** | **21117.1875** | **21117.1875** | **21117.1875** |  **127873.91 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | False            | True        | False        |   2.127 ms | 0.0195 ms |  0.0182 ms |  0.10 |    0.00 |     3.9063 |          - |          - |     138.63 KB |       0.001 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | False            | True        | False        |   3.168 ms | 0.0108 ms |  0.0095 ms |  0.14 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.001 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **False**            | **True**        | **True**         |  **53.278 ms** | **0.2586 ms** |  **0.2419 ms** |  **1.00** |    **0.01** | **63234.3750** | **63234.3750** | **63234.3750** |   **257435.6 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | False            | True        | True         |   3.619 ms | 0.0268 ms |  0.0251 ms |  0.07 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.001 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | False            | True        | True         |   4.463 ms | 0.0282 ms |  0.0250 ms |  0.08 |    0.00 |          - |          - |          - |      142.6 KB |       0.001 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **True**             | **False**       | **False**        |  **18.942 ms** | **0.1337 ms** |  **0.1251 ms** |  **1.00** |    **0.01** | **21117.1875** | **21117.1875** | **21117.1875** |    **64946.5 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | True             | False       | False        |   1.457 ms | 0.0091 ms |  0.0085 ms |  0.08 |    0.00 |     5.8594 |          - |          - |     138.63 KB |       0.002 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | True             | False       | False        |   1.389 ms | 0.0100 ms |  0.0093 ms |  0.07 |    0.00 |     5.8594 |          - |          - |     142.59 KB |       0.002 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **True**             | **False**       | **True**         |  **28.166 ms** | **0.1830 ms** |  **0.1712 ms** |  **1.00** |    **0.01** | **30570.3125** | **30570.3125** | **30570.3125** |   **97017.35 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | True             | False       | True         |   2.138 ms | 0.0083 ms |  0.0073 ms |  0.08 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.002 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | True             | False       | True         |   2.098 ms | 0.0104 ms |  0.0092 ms |  0.07 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.001 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **True**             | **True**        | **False**        |  **18.922 ms** | **0.1390 ms** |  **0.1300 ms** |  **1.00** |    **0.01** | **21117.1875** | **21117.1875** | **21117.1875** |    **64946.5 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | True             | True        | False        |   2.142 ms | 0.0182 ms |  0.0170 ms |  0.11 |    0.00 |     3.9063 |          - |          - |     138.63 KB |       0.002 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | True             | True        | False        |   2.285 ms | 0.0182 ms |  0.0171 ms |  0.12 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.002 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **131072**    | **True**             | **True**        | **True**         |  **28.320 ms** | **0.1027 ms** |  **0.0858 ms** |  **1.00** |    **0.00** | **30570.3125** | **30570.3125** | **30570.3125** |   **97017.35 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 131072    | True             | True        | True         |   3.557 ms | 0.0268 ms |  0.0250 ms |  0.13 |    0.00 |     7.8125 |          - |          - |     154.45 KB |       0.002 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 131072    | True             | True        | True         |   3.363 ms | 0.0195 ms |  0.0183 ms |  0.12 |    0.00 |     3.9063 |          - |          - |      142.6 KB |       0.001 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **False**            | **False**       | **False**        |  **86.222 ms** | **0.7138 ms** |  **0.6677 ms** |  **1.00** |    **0.01** | **77968.7500** | **77968.7500** | **77968.7500** |  **318932.25 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | False            | False       | False        |   3.135 ms | 0.0053 ms |  0.0041 ms |  0.04 |    0.00 |     3.9063 |          - |          - |     138.94 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | False            | False       | False        |   3.412 ms | 0.0124 ms |  0.0116 ms |  0.04 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **False**            | **False**       | **True**         |  **87.077 ms** | **0.3291 ms** |  **0.3078 ms** |  **1.00** |    **0.00** | **77968.7500** | **77968.7500** | **77968.7500** |  **318932.25 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | False            | False       | True         |   3.212 ms | 0.0092 ms |  0.0081 ms |  0.04 |    0.00 |     3.9063 |          - |          - |     138.94 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | False            | False       | True         |   3.551 ms | 0.0359 ms |  0.0335 ms |  0.04 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **False**            | **True**        | **False**        |  **86.289 ms** | **0.3824 ms** |  **0.3390 ms** |  **1.00** |    **0.01** | **77968.7500** | **77968.7500** | **77968.7500** |  **318932.24 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | False            | True        | False        |   4.943 ms | 0.0308 ms |  0.0288 ms |  0.06 |    0.00 |          - |          - |          - |     138.94 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | False            | True        | False        |   5.271 ms | 0.0471 ms |  0.0441 ms |  0.06 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **False**            | **True**        | **True**         |  **87.248 ms** | **0.5554 ms** |  **0.5195 ms** |  **1.00** |    **0.01** | **77968.7500** | **77968.7500** | **77968.7500** |  **318932.25 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | False            | True        | True         |   4.959 ms | 0.0270 ms |  0.0239 ms |  0.06 |    0.00 |          - |          - |          - |     138.94 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | False            | True        | True         |   5.313 ms | 0.0236 ms |  0.0221 ms |  0.06 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **True**             | **False**       | **False**        |  **43.245 ms** | **0.2554 ms** |  **0.2264 ms** |  **1.00** |    **0.01** | **38984.3750** | **38984.3750** | **38984.3750** |   **149786.2 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | True             | False       | False        |   3.121 ms | 0.0119 ms |  0.0106 ms |  0.07 |    0.00 |     3.9063 |          - |          - |       84.1 KB |       0.001 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | True             | False       | False        |   3.066 ms | 0.0233 ms |  0.0195 ms |  0.07 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **True**             | **False**       | **True**         |  **44.117 ms** | **0.5525 ms** |  **0.5168 ms** |  **1.00** |    **0.02** | **38968.7500** | **38968.7500** | **38968.7500** |  **152808.71 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | True             | False       | True         |   3.246 ms | 0.0295 ms |  0.0276 ms |  0.07 |    0.00 |     3.9063 |          - |          - |       84.1 KB |       0.001 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | True             | False       | True         |   3.216 ms | 0.0201 ms |  0.0188 ms |  0.07 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **True**             | **True**        | **False**        |  **43.470 ms** | **0.3365 ms** |  **0.3147 ms** |  **1.00** |    **0.01** | **38984.3750** | **38984.3750** | **38984.3750** |   **149786.2 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | True             | True        | False        |   4.910 ms | 0.0372 ms |  0.0348 ms |  0.11 |    0.00 |          - |          - |          - |       84.1 KB |       0.001 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | True             | True        | False        |   4.666 ms | 0.0259 ms |  0.0230 ms |  0.11 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **983040**    | **True**             | **True**        | **True**         |  **44.500 ms** | **0.6725 ms** |  **0.6291 ms** |  **1.00** |    **0.02** | **38968.7500** | **38968.7500** | **38968.7500** |  **152808.71 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 983040    | True             | True        | True         |   4.934 ms | 0.0252 ms |  0.0235 ms |  0.11 |    0.00 |          - |          - |          - |       84.1 KB |       0.001 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 983040    | True             | True        | True         |   4.849 ms | 0.0178 ms |  0.0166 ms |  0.11 |    0.00 |          - |          - |          - |      43.88 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **False**            | **False**       | **False**        | **196.268 ms** | **4.3899 ms** | **12.9438 ms** |  **1.00** |    **0.10** | **43666.6667** | **43666.6667** | **43666.6667** |  **950180.76 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | False            | False       | False        |  15.701 ms | 0.1579 ms |  0.1400 ms |  0.08 |    0.01 |   109.3750 |          - |          - |     2108.4 KB |       0.002 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | False            | False       | False        |  15.837 ms | 0.1814 ms |  0.1608 ms |  0.08 |    0.01 |          - |          - |          - |       8.17 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **False**            | **False**       | **True**         | **272.963 ms** | **5.2567 ms** |  **5.1628 ms** |  **1.00** |    **0.03** | **15500.0000** | **15500.0000** | **15500.0000** | **1867676.27 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | False            | False       | True         |  16.155 ms | 0.2556 ms |  0.2391 ms |  0.06 |    0.00 |    93.7500 |          - |          - |    2109.28 KB |       0.001 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | False            | False       | True         |  15.611 ms | 0.1093 ms |  0.0969 ms |  0.06 |    0.00 |          - |          - |          - |       8.16 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **False**            | **True**        | **False**        | **196.131 ms** | **3.9032 ms** |  **9.5746 ms** |  **1.00** |    **0.07** | **43250.0000** | **43250.0000** | **43250.0000** |  **950180.52 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | False            | True        | False        |  24.878 ms | 0.1794 ms |  0.1678 ms |  0.13 |    0.01 |    93.7500 |          - |          - |     2108.4 KB |       0.002 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | False            | True        | False        |  24.421 ms | 0.2538 ms |  0.2374 ms |  0.12 |    0.01 |          - |          - |          - |       8.17 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **False**            | **True**        | **True**         | **270.598 ms** | **5.3199 ms** |  **5.2249 ms** |  **1.00** |    **0.03** | **15500.0000** | **15500.0000** | **15500.0000** |  **1867676.3 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | False            | True        | True         |  24.667 ms | 0.2607 ms |  0.2311 ms |  0.09 |    0.00 |    93.7500 |          - |          - |    2109.28 KB |       0.001 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | False            | True        | True         |  24.666 ms | 0.2583 ms |  0.2290 ms |  0.09 |    0.00 |          - |          - |          - |       8.17 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **True**             | **False**       | **False**        | **116.206 ms** | **2.3196 ms** |  **3.8756 ms** |  **1.00** |    **0.05** | **19166.6667** | **19166.6667** | **19166.6667** |  **475144.62 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | True             | False       | False        |  15.809 ms | 0.3081 ms |  0.3667 ms |  0.14 |    0.01 |          - |          - |          - |     151.81 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | True             | False       | False        |  15.072 ms | 0.2649 ms |  0.2349 ms |  0.13 |    0.01 |          - |          - |          - |       8.16 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **True**             | **False**       | **True**         | **116.014 ms** | **2.0478 ms** |  **1.7100 ms** |  **1.00** |    **0.02** | **19000.0000** | **19000.0000** | **19000.0000** |  **475246.06 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | True             | False       | True         |  15.840 ms | 0.3079 ms |  0.2880 ms |  0.14 |    0.00 |          - |          - |          - |     152.68 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | True             | False       | True         |  15.202 ms | 0.3013 ms |  0.3224 ms |  0.13 |    0.00 |          - |          - |          - |       8.16 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **True**             | **True**        | **False**        | **116.345 ms** | **2.3210 ms** |  **4.1257 ms** |  **1.00** |    **0.05** | **19200.0000** | **19200.0000** | **19200.0000** |  **475144.65 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | True             | True        | False        |  24.040 ms | 0.1752 ms |  0.1553 ms |  0.21 |    0.01 |          - |          - |          - |     151.81 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | True             | True        | False        |  24.451 ms | 0.2438 ms |  0.2281 ms |  0.21 |    0.01 |          - |          - |          - |       8.17 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **16777216**  | **True**             | **True**        | **True**         | **114.784 ms** | **2.2272 ms** |  **3.4012 ms** |  **1.00** |    **0.04** | **19000.0000** | **19000.0000** | **19000.0000** |  **475246.06 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 16777216  | True             | True        | True         |  24.683 ms | 0.1759 ms |  0.1646 ms |  0.22 |    0.01 |          - |          - |          - |     152.68 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 16777216  | True             | True        | True         |  23.851 ms | 0.4763 ms |  0.6677 ms |  0.21 |    0.01 |          - |          - |          - |       8.17 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **False**            | **False**       | **False**        | **358.000 ms** | **5.3951 ms** |  **5.0466 ms** |  **1.00** |    **0.02** |  **9000.0000** |  **9000.0000** |  **9000.0000** | **2621407.65 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | False            | False       | False        |  98.465 ms | 1.9289 ms |  1.8043 ms |  0.28 |    0.01 |  1166.6667 |          - |          - |   23491.78 KB |       0.009 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | False            | False       | False        |  98.315 ms | 1.7909 ms |  1.6752 ms |  0.27 |    0.01 |          - |          - |          - |       2.88 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **False**            | **False**       | **True**         | **362.540 ms** | **4.0248 ms** |  **3.5679 ms** |  **1.00** |    **0.01** |  **9000.0000** |  **9000.0000** |  **9000.0000** | **2621407.65 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | False            | False       | True         |  95.472 ms | 1.7255 ms |  1.6140 ms |  0.26 |    0.00 |  1166.6667 |          - |          - |   23491.78 KB |       0.009 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | False            | False       | True         |  96.641 ms | 1.8577 ms |  2.4800 ms |  0.27 |    0.01 |          - |          - |          - |       2.88 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **False**            | **True**        | **False**        | **364.594 ms** | **5.4946 ms** |  **5.1396 ms** |  **1.00** |    **0.02** |  **9000.0000** |  **9000.0000** |  **9000.0000** | **2621407.65 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | False            | True        | False        | 143.029 ms | 1.2521 ms |  1.1713 ms |  0.39 |    0.01 |  1250.0000 |          - |          - |   23491.82 KB |       0.009 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | False            | True        | False        | 140.087 ms | 1.9639 ms |  1.8371 ms |  0.38 |    0.01 |          - |          - |          - |       2.91 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **False**            | **True**        | **True**         | **365.415 ms** | **6.7062 ms** |  **6.2730 ms** |  **1.00** |    **0.02** |  **9000.0000** |  **9000.0000** |  **9000.0000** | **2621407.65 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | False            | True        | True         | 145.581 ms | 2.8279 ms |  2.7774 ms |  0.40 |    0.01 |  1250.0000 |          - |          - |   23491.73 KB |       0.009 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | False            | True        | True         | 141.208 ms | 2.4584 ms |  2.2996 ms |  0.39 |    0.01 |          - |          - |          - |       2.91 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **True**             | **False**       | **False**        | **160.435 ms** | **3.1183 ms** |  **3.8296 ms** |  **1.00** |    **0.03** |  **9750.0000** |  **9750.0000** |  **9750.0000** |  **982404.16 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | True             | False       | False        |  94.112 ms | 1.8073 ms |  2.2195 ms |  0.59 |    0.02 |          - |          - |          - |     302.33 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | True             | False       | False        |  94.719 ms | 1.8150 ms |  1.5156 ms |  0.59 |    0.02 |          - |          - |          - |       2.88 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **True**             | **False**       | **True**         | **160.716 ms** | **3.1036 ms** |  **3.0481 ms** |  **1.00** |    **0.03** |  **9750.0000** |  **9750.0000** |  **9750.0000** |  **982415.41 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | True             | False       | True         |  94.907 ms | 1.8642 ms |  2.5518 ms |  0.59 |    0.02 |          - |          - |          - |     302.33 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | True             | False       | True         |  96.559 ms | 1.2206 ms |  1.1417 ms |  0.60 |    0.01 |          - |          - |          - |       2.88 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **True**             | **True**        | **False**        | **160.441 ms** | **3.0334 ms** |  **2.9792 ms** |  **1.00** |    **0.03** |  **9666.6667** |  **9666.6667** |  **9666.6667** |  **982404.16 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | True             | True        | False        | 141.173 ms | 1.1721 ms |  0.9787 ms |  0.88 |    0.02 |          - |          - |          - |     302.36 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | True             | True        | False        | 144.324 ms | 2.5820 ms |  2.4152 ms |  0.90 |    0.02 |          - |          - |          - |       2.91 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **100597760** | **True**             | **True**        | **True**         | **159.566 ms** | **3.1876 ms** |  **5.8287 ms** |  **1.00** |    **0.05** |  **9666.6667** |  **9666.6667** |  **9666.6667** |  **982415.41 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 100597760 | True             | True        | True         | 138.701 ms | 0.8709 ms |  0.7720 ms |  0.87 |    0.03 |          - |          - |          - |     302.36 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 100597760 | True             | True        | True         | 144.598 ms | 1.3100 ms |  1.2254 ms |  0.91 |    0.03 |          - |          - |          - |       2.91 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **False**            | **False**       | **False**        | **443.062 ms** | **6.4800 ms** |  **6.0614 ms** |  **1.00** |    **0.02** |  **8000.0000** |  **8000.0000** |  **8000.0000** | **3145709.73 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | False            | False       | False        | 128.833 ms | 2.2004 ms |  2.0583 ms |  0.29 |    0.01 |  3250.0000 |   250.0000 |          - |   60638.82 KB |       0.019 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | False            | False       | False        | 126.406 ms | 2.3958 ms |  2.2411 ms |  0.29 |    0.01 |          - |          - |          - |       1.79 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **False**            | **False**       | **True**         | **439.672 ms** | **4.9926 ms** |  **4.4258 ms** |  **1.00** |    **0.01** |  **8000.0000** |  **8000.0000** |  **8000.0000** | **3145709.73 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | False            | False       | True         | 131.393 ms | 2.6081 ms |  3.2984 ms |  0.30 |    0.01 |  3250.0000 |   250.0000 |          - |   60638.97 KB |       0.019 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | False            | False       | True         | 128.360 ms | 2.5641 ms |  3.2428 ms |  0.29 |    0.01 |          - |          - |          - |       1.79 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **False**            | **True**        | **False**        | **439.628 ms** | **6.8660 ms** |  **6.4224 ms** |  **1.00** |    **0.02** |  **8000.0000** |  **8000.0000** |  **8000.0000** | **3145709.73 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | False            | True        | False        | 195.799 ms | 3.4175 ms |  3.1967 ms |  0.45 |    0.01 |  3000.0000 |   333.3333 |          - |   60638.85 KB |       0.019 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | False            | True        | False        | 195.824 ms | 3.2417 ms |  3.0323 ms |  0.45 |    0.01 |          - |          - |          - |       1.82 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **False**            | **True**        | **True**         | **440.596 ms** | **6.9025 ms** |  **6.4566 ms** |  **1.00** |    **0.02** |  **8000.0000** |  **8000.0000** |  **8000.0000** | **3145709.73 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | False            | True        | True         | 194.822 ms | 2.7647 ms |  2.5861 ms |  0.44 |    0.01 |  3000.0000 |   333.3333 |          - |      60639 KB |       0.019 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | False            | True        | True         | 192.864 ms | 3.5433 ms |  3.3144 ms |  0.44 |    0.01 |          - |          - |          - |       1.82 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **True**             | **False**       | **False**        | **208.443 ms** | **4.0268 ms** |  **3.9549 ms** |  **1.00** |    **0.03** |  **5666.6667** |  **5666.6667** |  **5666.6667** |  **1228802.5 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | True             | False       | False        | 123.102 ms | 2.2608 ms |  2.0041 ms |  0.59 |    0.01 |          - |          - |          - |      376.5 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | True             | False       | False        | 128.526 ms | 2.5667 ms |  2.4009 ms |  0.62 |    0.02 |          - |          - |          - |       1.79 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **True**             | **False**       | **True**         | **206.795 ms** | **3.9145 ms** |  **3.6617 ms** |  **1.00** |    **0.02** |  **5666.6667** |  **5666.6667** |  **5666.6667** | **1228806.25 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | True             | False       | True         | 128.800 ms | 2.2403 ms |  2.0956 ms |  0.62 |    0.01 |          - |          - |          - |     376.66 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | True             | False       | True         | 131.364 ms | 2.5987 ms |  3.4692 ms |  0.64 |    0.02 |          - |          - |          - |       1.79 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **True**             | **True**        | **False**        | **202.299 ms** | **4.0128 ms** |  **4.4602 ms** |  **1.00** |    **0.03** |  **5666.6667** |  **5666.6667** |  **5666.6667** |  **1228802.5 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | True             | True        | False        | 192.998 ms | 3.4704 ms |  3.2462 ms |  0.95 |    0.03 |          - |          - |          - |     376.54 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | True             | True        | False        | 196.781 ms | 2.7331 ms |  2.5566 ms |  0.97 |    0.02 |          - |          - |          - |       1.72 KB |       0.000 |
+|                                                  |           |                  |             |              |            |           |            |       |         |            |            |            |               |             |
+| **&#39;MemoryStream segmented fill and read&#39;**           | **209715200** | **True**             | **True**        | **True**         | **198.984 ms** | **3.7743 ms** |  **3.7068 ms** |  **1.00** |    **0.03** |  **5666.6667** |  **5666.6667** |  **5666.6667** | **1228806.16 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream segmented fill and read&#39; | 209715200 | True             | True        | True         | 183.995 ms | 0.7869 ms |  0.6571 ms |  0.92 |    0.02 |          - |          - |          - |     376.69 KB |       0.000 |
+| &#39;MemoryStreamSlim segmented fill and read&#39;       | 209715200 | True             | True        | True         | 196.876 ms | 3.5601 ms |  3.3301 ms |  0.99 |    0.02 |          - |          - |          - |       1.82 KB |       0.000 |
diff --git a/Source/Docs/articles/MemoryStreamBenchmarks.SegmentedFillAndReadThroughputBenchmarks-report.html b/Source/Docs/articles/MemoryStreamBenchmarks.SegmentedFillAndReadThroughputBenchmarks-report.html
index d866d4c..28c5634 100644
--- a/Source/Docs/articles/MemoryStreamBenchmarks.SegmentedFillAndReadThroughputBenchmarks-report.html
+++ b/Source/Docs/articles/MemoryStreamBenchmarks.SegmentedFillAndReadThroughputBenchmarks-report.html
@@ -2,7 +2,7 @@
 <html lang='en'>
 <head>
 <meta charset='utf-8' />
-<title>MemoryStreamBenchmarks.SegmentedFillAndReadThroughputBenchmarks-20241011-214340</title>
+<title>MemoryStreamBenchmarks.SegmentedFillAndReadThroughputBenchmarks-20241024-204219</title>
 
 <style type="text/css">
 	table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
@@ -22,128 +22,128 @@
 <pre><code></code></pre>
 
 <table>
-<thead><tr><th>Method                                    </th><th>DataSize</th><th>CapacityOnCreate</th><th>ZeroBuffers</th><th>GrowEachLoop</th><th>Mean</th><th>Error</th><th>StdDev</th><th>Median</th><th>Ratio</th><th>RatioSD</th><th>Gen0</th><th>Gen1</th><th>Gen2</th><th>Allocated</th><th>Alloc Ratio</th>
+<thead><tr><th>Method                                    </th><th>DataSize</th><th>CapacityOnCreate</th><th>ZeroBuffers</th><th>GrowEachLoop</th><th>Mean</th><th>Error</th><th>StdDev</th><th>Ratio</th><th>RatioSD</th><th>Gen0</th><th>Gen1</th><th>Gen2</th><th>Allocated</th><th>Alloc Ratio</th>
 </tr>
-</thead><tbody><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>False</td><td>21.818 ms</td><td>0.0748 ms</td><td>0.0624 ms</td><td>21.817 ms</td><td>1.00</td><td>0.00</td><td>21109.3750</td><td>21109.3750</td><td>21109.3750</td><td>127873.92 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>False</td><td>1.457 ms</td><td>0.0278 ms</td><td>0.0232 ms</td><td>1.445 ms</td><td>0.07</td><td>0.00</td><td>5.8594</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>False</td><td>1.897 ms</td><td>0.0098 ms</td><td>0.0091 ms</td><td>1.893 ms</td><td>0.09</td><td>0.00</td><td>5.8594</td><td>-</td><td>-</td><td>142.59 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>True</td><td>52.135 ms</td><td>0.2502 ms</td><td>0.2340 ms</td><td>52.187 ms</td><td>1.00</td><td>0.01</td><td>63234.3750</td><td>63234.3750</td><td>63234.3750</td><td>257435.6 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>True</td><td>2.142 ms</td><td>0.0078 ms</td><td>0.0070 ms</td><td>2.140 ms</td><td>0.04</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>True</td><td>2.563 ms</td><td>0.0145 ms</td><td>0.0135 ms</td><td>2.566 ms</td><td>0.05</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>False</td><td>21.755 ms</td><td>0.1837 ms</td><td>0.1718 ms</td><td>21.764 ms</td><td>1.00</td><td>0.01</td><td>21109.3750</td><td>21109.3750</td><td>21109.3750</td><td>127873.92 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>False</td><td>2.114 ms</td><td>0.0194 ms</td><td>0.0182 ms</td><td>2.119 ms</td><td>0.10</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>False</td><td>3.205 ms</td><td>0.0223 ms</td><td>0.0208 ms</td><td>3.202 ms</td><td>0.15</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>True</td><td>52.269 ms</td><td>0.2089 ms</td><td>0.1954 ms</td><td>52.304 ms</td><td>1.00</td><td>0.01</td><td>63234.3750</td><td>63234.3750</td><td>63234.3750</td><td>257435.6 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>True</td><td>3.421 ms</td><td>0.0232 ms</td><td>0.0206 ms</td><td>3.423 ms</td><td>0.07</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>True</td><td>4.630 ms</td><td>0.0489 ms</td><td>0.0458 ms</td><td>4.613 ms</td><td>0.09</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>False</td><td>18.686 ms</td><td>0.0997 ms</td><td>0.0933 ms</td><td>18.712 ms</td><td>1.00</td><td>0.01</td><td>21117.1875</td><td>21117.1875</td><td>21117.1875</td><td>64946.5 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>False</td><td>1.448 ms</td><td>0.0071 ms</td><td>0.0067 ms</td><td>1.447 ms</td><td>0.08</td><td>0.00</td><td>5.8594</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>False</td><td>1.331 ms</td><td>0.0075 ms</td><td>0.0070 ms</td><td>1.331 ms</td><td>0.07</td><td>0.00</td><td>5.8594</td><td>-</td><td>-</td><td>142.59 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>True</td><td>27.830 ms</td><td>0.1134 ms</td><td>0.1005 ms</td><td>27.847 ms</td><td>1.00</td><td>0.00</td><td>30570.3125</td><td>30570.3125</td><td>30570.3125</td><td>97017.35 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>True</td><td>2.135 ms</td><td>0.0052 ms</td><td>0.0046 ms</td><td>2.136 ms</td><td>0.08</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>True</td><td>2.058 ms</td><td>0.0063 ms</td><td>0.0056 ms</td><td>2.060 ms</td><td>0.07</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>False</td><td>18.645 ms</td><td>0.1465 ms</td><td>0.1370 ms</td><td>18.614 ms</td><td>1.00</td><td>0.01</td><td>21117.1875</td><td>21117.1875</td><td>21117.1875</td><td>64946.5 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>False</td><td>2.111 ms</td><td>0.0196 ms</td><td>0.0184 ms</td><td>2.116 ms</td><td>0.11</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>False</td><td>2.164 ms</td><td>0.0139 ms</td><td>0.0130 ms</td><td>2.165 ms</td><td>0.12</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.59 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>True</td><td>27.944 ms</td><td>0.1775 ms</td><td>0.1661 ms</td><td>27.942 ms</td><td>1.00</td><td>0.01</td><td>30570.3125</td><td>30570.3125</td><td>30570.3125</td><td>97017.35 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>True</td><td>3.543 ms</td><td>0.0332 ms</td><td>0.0294 ms</td><td>3.544 ms</td><td>0.13</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>True</td><td>3.324 ms</td><td>0.0417 ms</td><td>0.0390 ms</td><td>3.328 ms</td><td>0.12</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>False</td><td>84.527 ms</td><td>0.4030 ms</td><td>0.3770 ms</td><td>84.577 ms</td><td>1.00</td><td>0.01</td><td>77968.7500</td><td>77968.7500</td><td>77968.7500</td><td>318932.25 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>False</td><td>3.171 ms</td><td>0.0138 ms</td><td>0.0129 ms</td><td>3.169 ms</td><td>0.04</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>138.94 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>False</td><td>3.524 ms</td><td>0.0087 ms</td><td>0.0081 ms</td><td>3.524 ms</td><td>0.04</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>True</td><td>85.581 ms</td><td>0.8009 ms</td><td>0.7099 ms</td><td>85.623 ms</td><td>1.00</td><td>0.01</td><td>77968.7500</td><td>77968.7500</td><td>77968.7500</td><td>318932.25 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>True</td><td>3.207 ms</td><td>0.0069 ms</td><td>0.0061 ms</td><td>3.209 ms</td><td>0.04</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>138.94 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>True</td><td>3.577 ms</td><td>0.0129 ms</td><td>0.0114 ms</td><td>3.578 ms</td><td>0.04</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>False</td><td>84.685 ms</td><td>0.4057 ms</td><td>0.3597 ms</td><td>84.760 ms</td><td>1.00</td><td>0.01</td><td>77968.7500</td><td>77968.7500</td><td>77968.7500</td><td>318932.25 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>False</td><td>4.947 ms</td><td>0.0554 ms</td><td>0.0518 ms</td><td>4.942 ms</td><td>0.06</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>138.94 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>False</td><td>5.568 ms</td><td>0.0569 ms</td><td>0.0532 ms</td><td>5.581 ms</td><td>0.07</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>True</td><td>85.896 ms</td><td>0.3737 ms</td><td>0.3495 ms</td><td>85.885 ms</td><td>1.00</td><td>0.01</td><td>77968.7500</td><td>77968.7500</td><td>77968.7500</td><td>318932.25 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>True</td><td>4.963 ms</td><td>0.0347 ms</td><td>0.0307 ms</td><td>4.958 ms</td><td>0.06</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>138.94 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>True</td><td>5.657 ms</td><td>0.0212 ms</td><td>0.0199 ms</td><td>5.656 ms</td><td>0.07</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>False</td><td>42.690 ms</td><td>0.3922 ms</td><td>0.3669 ms</td><td>42.719 ms</td><td>1.00</td><td>0.01</td><td>38984.3750</td><td>38984.3750</td><td>38984.3750</td><td>149786.2 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>False</td><td>3.148 ms</td><td>0.0120 ms</td><td>0.0112 ms</td><td>3.147 ms</td><td>0.07</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>84.1 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>False</td><td>2.804 ms</td><td>0.0117 ms</td><td>0.0110 ms</td><td>2.803 ms</td><td>0.07</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>True</td><td>44.404 ms</td><td>0.5078 ms</td><td>0.4750 ms</td><td>44.420 ms</td><td>1.00</td><td>0.01</td><td>38968.7500</td><td>38968.7500</td><td>38968.7500</td><td>152808.71 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>True</td><td>3.204 ms</td><td>0.0061 ms</td><td>0.0051 ms</td><td>3.204 ms</td><td>0.07</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>84.1 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>True</td><td>3.114 ms</td><td>0.0115 ms</td><td>0.0108 ms</td><td>3.116 ms</td><td>0.07</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>False</td><td>42.477 ms</td><td>0.3080 ms</td><td>0.2881 ms</td><td>42.409 ms</td><td>1.00</td><td>0.01</td><td>38984.3750</td><td>38984.3750</td><td>38984.3750</td><td>149786.2 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>False</td><td>4.987 ms</td><td>0.0500 ms</td><td>0.0467 ms</td><td>4.972 ms</td><td>0.12</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>84.1 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>False</td><td>4.748 ms</td><td>0.0643 ms</td><td>0.0601 ms</td><td>4.720 ms</td><td>0.11</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>True</td><td>43.683 ms</td><td>0.3936 ms</td><td>0.3681 ms</td><td>43.610 ms</td><td>1.00</td><td>0.01</td><td>38968.7500</td><td>38968.7500</td><td>38968.7500</td><td>152808.71 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>True</td><td>4.954 ms</td><td>0.0515 ms</td><td>0.0482 ms</td><td>4.936 ms</td><td>0.11</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>84.09 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>True</td><td>4.891 ms</td><td>0.0628 ms</td><td>0.0588 ms</td><td>4.870 ms</td><td>0.11</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>False</td><td>193.863 ms</td><td>3.8742 ms</td><td>9.6481 ms</td><td>196.459 ms</td><td>1.00</td><td>0.08</td><td>43250.0000</td><td>43250.0000</td><td>43250.0000</td><td>950180.6 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>False</td><td>15.469 ms</td><td>0.1974 ms</td><td>0.1750 ms</td><td>15.420 ms</td><td>0.08</td><td>0.00</td><td>109.3750</td><td>-</td><td>-</td><td>2108.4 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>False</td><td>16.877 ms</td><td>0.2989 ms</td><td>0.2796 ms</td><td>16.834 ms</td><td>0.09</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.17 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>True</td><td>269.748 ms</td><td>4.9505 ms</td><td>4.8620 ms</td><td>269.403 ms</td><td>1.00</td><td>0.02</td><td>15500.0000</td><td>15500.0000</td><td>15500.0000</td><td>1867676.29 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>True</td><td>15.570 ms</td><td>0.3009 ms</td><td>0.2955 ms</td><td>15.481 ms</td><td>0.06</td><td>0.00</td><td>109.3750</td><td>-</td><td>-</td><td>2109.27 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>True</td><td>16.778 ms</td><td>0.3248 ms</td><td>0.4224 ms</td><td>16.624 ms</td><td>0.06</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>8.17 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>False</td><td>194.253 ms</td><td>3.8411 ms</td><td>9.5657 ms</td><td>196.748 ms</td><td>1.00</td><td>0.08</td><td>42500.0000</td><td>42500.0000</td><td>42500.0000</td><td>950180.35 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>False</td><td>23.406 ms</td><td>0.1085 ms</td><td>0.0962 ms</td><td>23.371 ms</td><td>0.12</td><td>0.01</td><td>93.7500</td><td>-</td><td>-</td><td>2108.4 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>False</td><td>26.900 ms</td><td>0.5338 ms</td><td>0.4993 ms</td><td>26.719 ms</td><td>0.14</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.17 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>True</td><td>270.081 ms</td><td>5.3656 ms</td><td>5.7412 ms</td><td>270.275 ms</td><td>1.00</td><td>0.03</td><td>15500.0000</td><td>15500.0000</td><td>15500.0000</td><td>1867676.3 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>True</td><td>25.286 ms</td><td>0.4909 ms</td><td>0.5252 ms</td><td>25.388 ms</td><td>0.09</td><td>0.00</td><td>93.7500</td><td>-</td><td>-</td><td>2109.28 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>True</td><td>26.941 ms</td><td>0.5307 ms</td><td>0.8105 ms</td><td>26.767 ms</td><td>0.10</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>8.17 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>False</td><td>114.673 ms</td><td>2.2574 ms</td><td>4.7616 ms</td><td>115.690 ms</td><td>1.00</td><td>0.06</td><td>19200.0000</td><td>19200.0000</td><td>19200.0000</td><td>475144.65 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>False</td><td>15.223 ms</td><td>0.2763 ms</td><td>0.2450 ms</td><td>15.151 ms</td><td>0.13</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>151.8 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>False</td><td>14.514 ms</td><td>0.2308 ms</td><td>0.1927 ms</td><td>14.559 ms</td><td>0.13</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.16 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>True</td><td>114.857 ms</td><td>1.7035 ms</td><td>1.5934 ms</td><td>114.879 ms</td><td>1.00</td><td>0.02</td><td>19000.0000</td><td>19000.0000</td><td>19000.0000</td><td>475246.06 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>True</td><td>14.932 ms</td><td>0.0879 ms</td><td>0.0734 ms</td><td>14.917 ms</td><td>0.13</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>152.68 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>True</td><td>14.810 ms</td><td>0.2921 ms</td><td>0.5341 ms</td><td>14.658 ms</td><td>0.13</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>8.16 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>False</td><td>115.381 ms</td><td>2.2486 ms</td><td>2.1033 ms</td><td>116.344 ms</td><td>1.00</td><td>0.03</td><td>19166.6667</td><td>19166.6667</td><td>19166.6667</td><td>475144.62 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>False</td><td>23.594 ms</td><td>0.3234 ms</td><td>0.2867 ms</td><td>23.519 ms</td><td>0.20</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>151.81 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>False</td><td>22.897 ms</td><td>0.3121 ms</td><td>0.2920 ms</td><td>22.911 ms</td><td>0.20</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>8.17 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>True</td><td>114.824 ms</td><td>2.2571 ms</td><td>3.7712 ms</td><td>115.313 ms</td><td>1.00</td><td>0.05</td><td>19000.0000</td><td>19000.0000</td><td>19000.0000</td><td>475246.06 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>True</td><td>24.117 ms</td><td>0.3192 ms</td><td>0.2985 ms</td><td>24.161 ms</td><td>0.21</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>152.68 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>True</td><td>23.210 ms</td><td>0.4412 ms</td><td>0.4127 ms</td><td>23.203 ms</td><td>0.20</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.17 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>False</td><td>366.433 ms</td><td>5.9572 ms</td><td>5.5724 ms</td><td>367.650 ms</td><td>1.00</td><td>0.02</td><td>9000.0000</td><td>9000.0000</td><td>9000.0000</td><td>2621407.65 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>False</td><td>92.110 ms</td><td>1.3932 ms</td><td>1.0877 ms</td><td>91.998 ms</td><td>0.25</td><td>0.00</td><td>1166.6667</td><td>-</td><td>-</td><td>23491.78 KB</td><td>0.009</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>False</td><td>94.915 ms</td><td>0.8429 ms</td><td>0.7472 ms</td><td>94.748 ms</td><td>0.26</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>2.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>True</td><td>357.067 ms</td><td>4.9853 ms</td><td>4.6633 ms</td><td>355.916 ms</td><td>1.00</td><td>0.02</td><td>9000.0000</td><td>9000.0000</td><td>9000.0000</td><td>2621407.65 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>True</td><td>92.640 ms</td><td>1.8444 ms</td><td>2.7035 ms</td><td>91.084 ms</td><td>0.26</td><td>0.01</td><td>1166.6667</td><td>-</td><td>-</td><td>23491.78 KB</td><td>0.009</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>True</td><td>98.770 ms</td><td>1.8018 ms</td><td>2.7515 ms</td><td>98.336 ms</td><td>0.28</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.89 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>False</td><td>362.133 ms</td><td>7.0007 ms</td><td>6.5485 ms</td><td>362.841 ms</td><td>1.00</td><td>0.02</td><td>9000.0000</td><td>9000.0000</td><td>9000.0000</td><td>2621407.65 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>False</td><td>140.978 ms</td><td>2.7449 ms</td><td>2.5676 ms</td><td>140.219 ms</td><td>0.39</td><td>0.01</td><td>1250.0000</td><td>-</td><td>-</td><td>23491.82 KB</td><td>0.009</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>False</td><td>146.386 ms</td><td>2.8204 ms</td><td>3.6674 ms</td><td>146.295 ms</td><td>0.40</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>True</td><td>357.148 ms</td><td>6.1035 ms</td><td>5.7092 ms</td><td>355.354 ms</td><td>1.00</td><td>0.02</td><td>9000.0000</td><td>9000.0000</td><td>9000.0000</td><td>2621407.65 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>True</td><td>140.035 ms</td><td>1.0850 ms</td><td>1.0149 ms</td><td>139.720 ms</td><td>0.39</td><td>0.01</td><td>1250.0000</td><td>-</td><td>-</td><td>23491.82 KB</td><td>0.009</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>True</td><td>146.910 ms</td><td>2.8930 ms</td><td>3.8621 ms</td><td>146.415 ms</td><td>0.41</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>False</td><td>161.084 ms</td><td>3.1575 ms</td><td>4.7261 ms</td><td>160.482 ms</td><td>1.00</td><td>0.04</td><td>9750.0000</td><td>9750.0000</td><td>9750.0000</td><td>982404.16 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>False</td><td>88.737 ms</td><td>1.2786 ms</td><td>1.1335 ms</td><td>88.278 ms</td><td>0.55</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>302.33 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>False</td><td>91.863 ms</td><td>1.7380 ms</td><td>1.7848 ms</td><td>91.370 ms</td><td>0.57</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>2.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>True</td><td>158.744 ms</td><td>3.0900 ms</td><td>4.6250 ms</td><td>158.399 ms</td><td>1.00</td><td>0.04</td><td>9750.0000</td><td>9750.0000</td><td>9750.0000</td><td>982415.34 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>True</td><td>88.183 ms</td><td>0.7793 ms</td><td>0.6084 ms</td><td>88.038 ms</td><td>0.56</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>302.33 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>True</td><td>94.749 ms</td><td>1.8767 ms</td><td>3.1868 ms</td><td>93.501 ms</td><td>0.60</td><td>0.03</td><td>-</td><td>-</td><td>-</td><td>2.88 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>False</td><td>157.669 ms</td><td>3.1134 ms</td><td>4.7546 ms</td><td>158.013 ms</td><td>1.00</td><td>0.04</td><td>9666.6667</td><td>9666.6667</td><td>9666.6667</td><td>982404.16 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>False</td><td>138.744 ms</td><td>2.4134 ms</td><td>2.2575 ms</td><td>138.389 ms</td><td>0.88</td><td>0.03</td><td>-</td><td>-</td><td>-</td><td>302.36 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>False</td><td>140.889 ms</td><td>2.6854 ms</td><td>3.2979 ms</td><td>140.053 ms</td><td>0.89</td><td>0.03</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>True</td><td>159.337 ms</td><td>3.1719 ms</td><td>5.2996 ms</td><td>157.928 ms</td><td>1.00</td><td>0.05</td><td>9666.6667</td><td>9666.6667</td><td>9666.6667</td><td>982415.41 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>True</td><td>137.265 ms</td><td>1.5373 ms</td><td>1.4380 ms</td><td>137.261 ms</td><td>0.86</td><td>0.03</td><td>-</td><td>-</td><td>-</td><td>302.36 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>True</td><td>137.525 ms</td><td>2.0125 ms</td><td>1.7840 ms</td><td>138.165 ms</td><td>0.86</td><td>0.03</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>False</td><td>438.707 ms</td><td>7.0014 ms</td><td>8.3347 ms</td><td>440.511 ms</td><td>1.00</td><td>0.03</td><td>8000.0000</td><td>8000.0000</td><td>8000.0000</td><td>3145709.73 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>False</td><td>126.947 ms</td><td>2.4891 ms</td><td>3.4070 ms</td><td>126.118 ms</td><td>0.29</td><td>0.01</td><td>3250.0000</td><td>250.0000</td><td>-</td><td>60638.73 KB</td><td>0.019</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>False</td><td>133.258 ms</td><td>2.6608 ms</td><td>4.2966 ms</td><td>132.723 ms</td><td>0.30</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.79 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>True</td><td>433.728 ms</td><td>6.4141 ms</td><td>5.9998 ms</td><td>432.459 ms</td><td>1.00</td><td>0.02</td><td>8000.0000</td><td>8000.0000</td><td>8000.0000</td><td>3145709.73 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>True</td><td>124.880 ms</td><td>1.8325 ms</td><td>1.5303 ms</td><td>124.496 ms</td><td>0.29</td><td>0.01</td><td>3250.0000</td><td>250.0000</td><td>-</td><td>60638.9 KB</td><td>0.019</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>True</td><td>129.577 ms</td><td>2.1441 ms</td><td>2.0056 ms</td><td>129.419 ms</td><td>0.30</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.79 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>False</td><td>433.458 ms</td><td>6.5821 ms</td><td>6.1569 ms</td><td>432.431 ms</td><td>1.00</td><td>0.02</td><td>8000.0000</td><td>8000.0000</td><td>8000.0000</td><td>3145709.73 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>False</td><td>190.585 ms</td><td>3.4892 ms</td><td>3.2638 ms</td><td>190.768 ms</td><td>0.44</td><td>0.01</td><td>3000.0000</td><td>333.3333</td><td>-</td><td>60638.85 KB</td><td>0.019</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>False</td><td>202.791 ms</td><td>3.8677 ms</td><td>3.7986 ms</td><td>203.203 ms</td><td>0.47</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.82 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>True</td><td>430.366 ms</td><td>5.4365 ms</td><td>4.8193 ms</td><td>430.323 ms</td><td>1.00</td><td>0.02</td><td>8000.0000</td><td>8000.0000</td><td>8000.0000</td><td>3145709.73 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>True</td><td>189.047 ms</td><td>2.7878 ms</td><td>2.6077 ms</td><td>188.422 ms</td><td>0.44</td><td>0.01</td><td>3000.0000</td><td>333.3333</td><td>-</td><td>60639 KB</td><td>0.019</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>True</td><td>201.289 ms</td><td>3.8767 ms</td><td>3.9811 ms</td><td>200.748 ms</td><td>0.47</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.82 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>False</td><td>198.306 ms</td><td>3.8255 ms</td><td>3.5784 ms</td><td>199.363 ms</td><td>1.00</td><td>0.03</td><td>5666.6667</td><td>5666.6667</td><td>5666.6667</td><td>1228802.5 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>False</td><td>118.411 ms</td><td>0.9403 ms</td><td>0.7852 ms</td><td>118.298 ms</td><td>0.60</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.48 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>False</td><td>122.601 ms</td><td>1.0538 ms</td><td>0.9342 ms</td><td>122.635 ms</td><td>0.62</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.79 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>True</td><td>203.360 ms</td><td>4.0109 ms</td><td>5.7524 ms</td><td>202.017 ms</td><td>1.00</td><td>0.04</td><td>5666.6667</td><td>5666.6667</td><td>5666.6667</td><td>1228806.25 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>True</td><td>123.899 ms</td><td>2.4639 ms</td><td>3.8359 ms</td><td>124.157 ms</td><td>0.61</td><td>0.03</td><td>-</td><td>-</td><td>-</td><td>376.66 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>True</td><td>124.416 ms</td><td>2.3794 ms</td><td>2.1093 ms</td><td>123.583 ms</td><td>0.61</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>1.79 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>False</td><td>203.558 ms</td><td>4.0339 ms</td><td>5.6549 ms</td><td>202.606 ms</td><td>1.00</td><td>0.04</td><td>5666.6667</td><td>5666.6667</td><td>5666.6667</td><td>1228802.41 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>False</td><td>184.637 ms</td><td>2.0636 ms</td><td>1.8293 ms</td><td>184.295 ms</td><td>0.91</td><td>0.03</td><td>-</td><td>-</td><td>-</td><td>376.54 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>False</td><td>186.651 ms</td><td>1.9620 ms</td><td>1.8353 ms</td><td>186.186 ms</td><td>0.92</td><td>0.03</td><td>-</td><td>-</td><td>-</td><td>1.82 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>True</td><td>200.762 ms</td><td>3.0647 ms</td><td>2.8668 ms</td><td>200.881 ms</td><td>1.00</td><td>0.02</td><td>5666.6667</td><td>5666.6667</td><td>5666.6667</td><td>1228806.25 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>True</td><td>187.238 ms</td><td>3.6100 ms</td><td>4.2974 ms</td><td>188.407 ms</td><td>0.93</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>376.69 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>True</td><td>189.451 ms</td><td>3.3189 ms</td><td>2.9421 ms</td><td>189.858 ms</td><td>0.94</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>1.82 KB</td><td>0.000</td>
+</thead><tbody><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>False</td><td>22.183 ms</td><td>0.1438 ms</td><td>0.1345 ms</td><td>1.00</td><td>0.01</td><td>21109.3750</td><td>21109.3750</td><td>21109.3750</td><td>127873.92 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>False</td><td>1.458 ms</td><td>0.0091 ms</td><td>0.0085 ms</td><td>0.07</td><td>0.00</td><td>5.8594</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>False</td><td>1.981 ms</td><td>0.0094 ms</td><td>0.0078 ms</td><td>0.09</td><td>0.00</td><td>5.8594</td><td>-</td><td>-</td><td>142.59 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>True</td><td>53.109 ms</td><td>0.2264 ms</td><td>0.2117 ms</td><td>1.00</td><td>0.01</td><td>63234.3750</td><td>63234.3750</td><td>63234.3750</td><td>257435.6 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>True</td><td>2.125 ms</td><td>0.0079 ms</td><td>0.0074 ms</td><td>0.04</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>False</td><td>False</td><td>True</td><td>2.692 ms</td><td>0.0097 ms</td><td>0.0086 ms</td><td>0.05</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>False</td><td>22.171 ms</td><td>0.1282 ms</td><td>0.1071 ms</td><td>1.00</td><td>0.01</td><td>21117.1875</td><td>21117.1875</td><td>21117.1875</td><td>127873.91 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>False</td><td>2.127 ms</td><td>0.0195 ms</td><td>0.0182 ms</td><td>0.10</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>False</td><td>3.168 ms</td><td>0.0108 ms</td><td>0.0095 ms</td><td>0.14</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>True</td><td>53.278 ms</td><td>0.2586 ms</td><td>0.2419 ms</td><td>1.00</td><td>0.01</td><td>63234.3750</td><td>63234.3750</td><td>63234.3750</td><td>257435.6 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>True</td><td>3.619 ms</td><td>0.0268 ms</td><td>0.0251 ms</td><td>0.07</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>False</td><td>True</td><td>True</td><td>4.463 ms</td><td>0.0282 ms</td><td>0.0250 ms</td><td>0.08</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>False</td><td>18.942 ms</td><td>0.1337 ms</td><td>0.1251 ms</td><td>1.00</td><td>0.01</td><td>21117.1875</td><td>21117.1875</td><td>21117.1875</td><td>64946.5 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>False</td><td>1.457 ms</td><td>0.0091 ms</td><td>0.0085 ms</td><td>0.08</td><td>0.00</td><td>5.8594</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>False</td><td>1.389 ms</td><td>0.0100 ms</td><td>0.0093 ms</td><td>0.07</td><td>0.00</td><td>5.8594</td><td>-</td><td>-</td><td>142.59 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>True</td><td>28.166 ms</td><td>0.1830 ms</td><td>0.1712 ms</td><td>1.00</td><td>0.01</td><td>30570.3125</td><td>30570.3125</td><td>30570.3125</td><td>97017.35 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>True</td><td>2.138 ms</td><td>0.0083 ms</td><td>0.0073 ms</td><td>0.08</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>True</td><td>False</td><td>True</td><td>2.098 ms</td><td>0.0104 ms</td><td>0.0092 ms</td><td>0.07</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>False</td><td>18.922 ms</td><td>0.1390 ms</td><td>0.1300 ms</td><td>1.00</td><td>0.01</td><td>21117.1875</td><td>21117.1875</td><td>21117.1875</td><td>64946.5 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>False</td><td>2.142 ms</td><td>0.0182 ms</td><td>0.0170 ms</td><td>0.11</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>138.63 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>False</td><td>2.285 ms</td><td>0.0182 ms</td><td>0.0171 ms</td><td>0.12</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>True</td><td>28.320 ms</td><td>0.1027 ms</td><td>0.0858 ms</td><td>1.00</td><td>0.00</td><td>30570.3125</td><td>30570.3125</td><td>30570.3125</td><td>97017.35 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>True</td><td>3.557 ms</td><td>0.0268 ms</td><td>0.0250 ms</td><td>0.13</td><td>0.00</td><td>7.8125</td><td>-</td><td>-</td><td>154.45 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>131072</td><td>True</td><td>True</td><td>True</td><td>3.363 ms</td><td>0.0195 ms</td><td>0.0183 ms</td><td>0.12</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>142.6 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>False</td><td>86.222 ms</td><td>0.7138 ms</td><td>0.6677 ms</td><td>1.00</td><td>0.01</td><td>77968.7500</td><td>77968.7500</td><td>77968.7500</td><td>318932.25 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>False</td><td>3.135 ms</td><td>0.0053 ms</td><td>0.0041 ms</td><td>0.04</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>138.94 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>False</td><td>3.412 ms</td><td>0.0124 ms</td><td>0.0116 ms</td><td>0.04</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>True</td><td>87.077 ms</td><td>0.3291 ms</td><td>0.3078 ms</td><td>1.00</td><td>0.00</td><td>77968.7500</td><td>77968.7500</td><td>77968.7500</td><td>318932.25 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>True</td><td>3.212 ms</td><td>0.0092 ms</td><td>0.0081 ms</td><td>0.04</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>138.94 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>False</td><td>False</td><td>True</td><td>3.551 ms</td><td>0.0359 ms</td><td>0.0335 ms</td><td>0.04</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>False</td><td>86.289 ms</td><td>0.3824 ms</td><td>0.3390 ms</td><td>1.00</td><td>0.01</td><td>77968.7500</td><td>77968.7500</td><td>77968.7500</td><td>318932.24 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>False</td><td>4.943 ms</td><td>0.0308 ms</td><td>0.0288 ms</td><td>0.06</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>138.94 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>False</td><td>5.271 ms</td><td>0.0471 ms</td><td>0.0441 ms</td><td>0.06</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>True</td><td>87.248 ms</td><td>0.5554 ms</td><td>0.5195 ms</td><td>1.00</td><td>0.01</td><td>77968.7500</td><td>77968.7500</td><td>77968.7500</td><td>318932.25 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>True</td><td>4.959 ms</td><td>0.0270 ms</td><td>0.0239 ms</td><td>0.06</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>138.94 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>False</td><td>True</td><td>True</td><td>5.313 ms</td><td>0.0236 ms</td><td>0.0221 ms</td><td>0.06</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>False</td><td>43.245 ms</td><td>0.2554 ms</td><td>0.2264 ms</td><td>1.00</td><td>0.01</td><td>38984.3750</td><td>38984.3750</td><td>38984.3750</td><td>149786.2 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>False</td><td>3.121 ms</td><td>0.0119 ms</td><td>0.0106 ms</td><td>0.07</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>84.1 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>False</td><td>3.066 ms</td><td>0.0233 ms</td><td>0.0195 ms</td><td>0.07</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>True</td><td>44.117 ms</td><td>0.5525 ms</td><td>0.5168 ms</td><td>1.00</td><td>0.02</td><td>38968.7500</td><td>38968.7500</td><td>38968.7500</td><td>152808.71 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>True</td><td>3.246 ms</td><td>0.0295 ms</td><td>0.0276 ms</td><td>0.07</td><td>0.00</td><td>3.9063</td><td>-</td><td>-</td><td>84.1 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>True</td><td>False</td><td>True</td><td>3.216 ms</td><td>0.0201 ms</td><td>0.0188 ms</td><td>0.07</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>False</td><td>43.470 ms</td><td>0.3365 ms</td><td>0.3147 ms</td><td>1.00</td><td>0.01</td><td>38984.3750</td><td>38984.3750</td><td>38984.3750</td><td>149786.2 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>False</td><td>4.910 ms</td><td>0.0372 ms</td><td>0.0348 ms</td><td>0.11</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>84.1 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>False</td><td>4.666 ms</td><td>0.0259 ms</td><td>0.0230 ms</td><td>0.11</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>True</td><td>44.500 ms</td><td>0.6725 ms</td><td>0.6291 ms</td><td>1.00</td><td>0.02</td><td>38968.7500</td><td>38968.7500</td><td>38968.7500</td><td>152808.71 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>True</td><td>4.934 ms</td><td>0.0252 ms</td><td>0.0235 ms</td><td>0.11</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>84.1 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>983040</td><td>True</td><td>True</td><td>True</td><td>4.849 ms</td><td>0.0178 ms</td><td>0.0166 ms</td><td>0.11</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>43.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>False</td><td>196.268 ms</td><td>4.3899 ms</td><td>12.9438 ms</td><td>1.00</td><td>0.10</td><td>43666.6667</td><td>43666.6667</td><td>43666.6667</td><td>950180.76 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>False</td><td>15.701 ms</td><td>0.1579 ms</td><td>0.1400 ms</td><td>0.08</td><td>0.01</td><td>109.3750</td><td>-</td><td>-</td><td>2108.4 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>False</td><td>15.837 ms</td><td>0.1814 ms</td><td>0.1608 ms</td><td>0.08</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.17 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>True</td><td>272.963 ms</td><td>5.2567 ms</td><td>5.1628 ms</td><td>1.00</td><td>0.03</td><td>15500.0000</td><td>15500.0000</td><td>15500.0000</td><td>1867676.27 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>True</td><td>16.155 ms</td><td>0.2556 ms</td><td>0.2391 ms</td><td>0.06</td><td>0.00</td><td>93.7500</td><td>-</td><td>-</td><td>2109.28 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>False</td><td>True</td><td>15.611 ms</td><td>0.1093 ms</td><td>0.0969 ms</td><td>0.06</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>8.16 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>False</td><td>196.131 ms</td><td>3.9032 ms</td><td>9.5746 ms</td><td>1.00</td><td>0.07</td><td>43250.0000</td><td>43250.0000</td><td>43250.0000</td><td>950180.52 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>False</td><td>24.878 ms</td><td>0.1794 ms</td><td>0.1678 ms</td><td>0.13</td><td>0.01</td><td>93.7500</td><td>-</td><td>-</td><td>2108.4 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>False</td><td>24.421 ms</td><td>0.2538 ms</td><td>0.2374 ms</td><td>0.12</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.17 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>True</td><td>270.598 ms</td><td>5.3199 ms</td><td>5.2249 ms</td><td>1.00</td><td>0.03</td><td>15500.0000</td><td>15500.0000</td><td>15500.0000</td><td>1867676.3 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>True</td><td>24.667 ms</td><td>0.2607 ms</td><td>0.2311 ms</td><td>0.09</td><td>0.00</td><td>93.7500</td><td>-</td><td>-</td><td>2109.28 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>False</td><td>True</td><td>True</td><td>24.666 ms</td><td>0.2583 ms</td><td>0.2290 ms</td><td>0.09</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>8.17 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>False</td><td>116.206 ms</td><td>2.3196 ms</td><td>3.8756 ms</td><td>1.00</td><td>0.05</td><td>19166.6667</td><td>19166.6667</td><td>19166.6667</td><td>475144.62 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>False</td><td>15.809 ms</td><td>0.3081 ms</td><td>0.3667 ms</td><td>0.14</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>151.81 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>False</td><td>15.072 ms</td><td>0.2649 ms</td><td>0.2349 ms</td><td>0.13</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.16 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>True</td><td>116.014 ms</td><td>2.0478 ms</td><td>1.7100 ms</td><td>1.00</td><td>0.02</td><td>19000.0000</td><td>19000.0000</td><td>19000.0000</td><td>475246.06 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>True</td><td>15.840 ms</td><td>0.3079 ms</td><td>0.2880 ms</td><td>0.14</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>152.68 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>False</td><td>True</td><td>15.202 ms</td><td>0.3013 ms</td><td>0.3224 ms</td><td>0.13</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>8.16 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>False</td><td>116.345 ms</td><td>2.3210 ms</td><td>4.1257 ms</td><td>1.00</td><td>0.05</td><td>19200.0000</td><td>19200.0000</td><td>19200.0000</td><td>475144.65 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>False</td><td>24.040 ms</td><td>0.1752 ms</td><td>0.1553 ms</td><td>0.21</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>151.81 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>False</td><td>24.451 ms</td><td>0.2438 ms</td><td>0.2281 ms</td><td>0.21</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.17 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>True</td><td>114.784 ms</td><td>2.2272 ms</td><td>3.4012 ms</td><td>1.00</td><td>0.04</td><td>19000.0000</td><td>19000.0000</td><td>19000.0000</td><td>475246.06 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>True</td><td>24.683 ms</td><td>0.1759 ms</td><td>0.1646 ms</td><td>0.22</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>152.68 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>16777216</td><td>True</td><td>True</td><td>True</td><td>23.851 ms</td><td>0.4763 ms</td><td>0.6677 ms</td><td>0.21</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>8.17 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>False</td><td>358.000 ms</td><td>5.3951 ms</td><td>5.0466 ms</td><td>1.00</td><td>0.02</td><td>9000.0000</td><td>9000.0000</td><td>9000.0000</td><td>2621407.65 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>False</td><td>98.465 ms</td><td>1.9289 ms</td><td>1.8043 ms</td><td>0.28</td><td>0.01</td><td>1166.6667</td><td>-</td><td>-</td><td>23491.78 KB</td><td>0.009</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>False</td><td>98.315 ms</td><td>1.7909 ms</td><td>1.6752 ms</td><td>0.27</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>True</td><td>362.540 ms</td><td>4.0248 ms</td><td>3.5679 ms</td><td>1.00</td><td>0.01</td><td>9000.0000</td><td>9000.0000</td><td>9000.0000</td><td>2621407.65 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>True</td><td>95.472 ms</td><td>1.7255 ms</td><td>1.6140 ms</td><td>0.26</td><td>0.00</td><td>1166.6667</td><td>-</td><td>-</td><td>23491.78 KB</td><td>0.009</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>False</td><td>True</td><td>96.641 ms</td><td>1.8577 ms</td><td>2.4800 ms</td><td>0.27</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>False</td><td>364.594 ms</td><td>5.4946 ms</td><td>5.1396 ms</td><td>1.00</td><td>0.02</td><td>9000.0000</td><td>9000.0000</td><td>9000.0000</td><td>2621407.65 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>False</td><td>143.029 ms</td><td>1.2521 ms</td><td>1.1713 ms</td><td>0.39</td><td>0.01</td><td>1250.0000</td><td>-</td><td>-</td><td>23491.82 KB</td><td>0.009</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>False</td><td>140.087 ms</td><td>1.9639 ms</td><td>1.8371 ms</td><td>0.38</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>True</td><td>365.415 ms</td><td>6.7062 ms</td><td>6.2730 ms</td><td>1.00</td><td>0.02</td><td>9000.0000</td><td>9000.0000</td><td>9000.0000</td><td>2621407.65 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>True</td><td>145.581 ms</td><td>2.8279 ms</td><td>2.7774 ms</td><td>0.40</td><td>0.01</td><td>1250.0000</td><td>-</td><td>-</td><td>23491.73 KB</td><td>0.009</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>False</td><td>True</td><td>True</td><td>141.208 ms</td><td>2.4584 ms</td><td>2.2996 ms</td><td>0.39</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>False</td><td>160.435 ms</td><td>3.1183 ms</td><td>3.8296 ms</td><td>1.00</td><td>0.03</td><td>9750.0000</td><td>9750.0000</td><td>9750.0000</td><td>982404.16 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>False</td><td>94.112 ms</td><td>1.8073 ms</td><td>2.2195 ms</td><td>0.59</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>302.33 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>False</td><td>94.719 ms</td><td>1.8150 ms</td><td>1.5156 ms</td><td>0.59</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>2.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>True</td><td>160.716 ms</td><td>3.1036 ms</td><td>3.0481 ms</td><td>1.00</td><td>0.03</td><td>9750.0000</td><td>9750.0000</td><td>9750.0000</td><td>982415.41 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>True</td><td>94.907 ms</td><td>1.8642 ms</td><td>2.5518 ms</td><td>0.59</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>302.33 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>False</td><td>True</td><td>96.559 ms</td><td>1.2206 ms</td><td>1.1417 ms</td><td>0.60</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>2.88 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>False</td><td>160.441 ms</td><td>3.0334 ms</td><td>2.9792 ms</td><td>1.00</td><td>0.03</td><td>9666.6667</td><td>9666.6667</td><td>9666.6667</td><td>982404.16 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>False</td><td>141.173 ms</td><td>1.1721 ms</td><td>0.9787 ms</td><td>0.88</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>302.36 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>False</td><td>144.324 ms</td><td>2.5820 ms</td><td>2.4152 ms</td><td>0.90</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>True</td><td>159.566 ms</td><td>3.1876 ms</td><td>5.8287 ms</td><td>1.00</td><td>0.05</td><td>9666.6667</td><td>9666.6667</td><td>9666.6667</td><td>982415.41 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>True</td><td>138.701 ms</td><td>0.8709 ms</td><td>0.7720 ms</td><td>0.87</td><td>0.03</td><td>-</td><td>-</td><td>-</td><td>302.36 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>100597760</td><td>True</td><td>True</td><td>True</td><td>144.598 ms</td><td>1.3100 ms</td><td>1.2254 ms</td><td>0.91</td><td>0.03</td><td>-</td><td>-</td><td>-</td><td>2.91 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>False</td><td>443.062 ms</td><td>6.4800 ms</td><td>6.0614 ms</td><td>1.00</td><td>0.02</td><td>8000.0000</td><td>8000.0000</td><td>8000.0000</td><td>3145709.73 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>False</td><td>128.833 ms</td><td>2.2004 ms</td><td>2.0583 ms</td><td>0.29</td><td>0.01</td><td>3250.0000</td><td>250.0000</td><td>-</td><td>60638.82 KB</td><td>0.019</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>False</td><td>126.406 ms</td><td>2.3958 ms</td><td>2.2411 ms</td><td>0.29</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.79 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>True</td><td>439.672 ms</td><td>4.9926 ms</td><td>4.4258 ms</td><td>1.00</td><td>0.01</td><td>8000.0000</td><td>8000.0000</td><td>8000.0000</td><td>3145709.73 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>True</td><td>131.393 ms</td><td>2.6081 ms</td><td>3.2984 ms</td><td>0.30</td><td>0.01</td><td>3250.0000</td><td>250.0000</td><td>-</td><td>60638.97 KB</td><td>0.019</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>False</td><td>True</td><td>128.360 ms</td><td>2.5641 ms</td><td>3.2428 ms</td><td>0.29</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.79 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>False</td><td>439.628 ms</td><td>6.8660 ms</td><td>6.4224 ms</td><td>1.00</td><td>0.02</td><td>8000.0000</td><td>8000.0000</td><td>8000.0000</td><td>3145709.73 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>False</td><td>195.799 ms</td><td>3.4175 ms</td><td>3.1967 ms</td><td>0.45</td><td>0.01</td><td>3000.0000</td><td>333.3333</td><td>-</td><td>60638.85 KB</td><td>0.019</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>False</td><td>195.824 ms</td><td>3.2417 ms</td><td>3.0323 ms</td><td>0.45</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.82 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>True</td><td>440.596 ms</td><td>6.9025 ms</td><td>6.4566 ms</td><td>1.00</td><td>0.02</td><td>8000.0000</td><td>8000.0000</td><td>8000.0000</td><td>3145709.73 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>True</td><td>194.822 ms</td><td>2.7647 ms</td><td>2.5861 ms</td><td>0.44</td><td>0.01</td><td>3000.0000</td><td>333.3333</td><td>-</td><td>60639 KB</td><td>0.019</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>False</td><td>True</td><td>True</td><td>192.864 ms</td><td>3.5433 ms</td><td>3.3144 ms</td><td>0.44</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>1.82 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>False</td><td>208.443 ms</td><td>4.0268 ms</td><td>3.9549 ms</td><td>1.00</td><td>0.03</td><td>5666.6667</td><td>5666.6667</td><td>5666.6667</td><td>1228802.5 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>False</td><td>123.102 ms</td><td>2.2608 ms</td><td>2.0041 ms</td><td>0.59</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.5 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>False</td><td>128.526 ms</td><td>2.5667 ms</td><td>2.4009 ms</td><td>0.62</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>1.79 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>True</td><td>206.795 ms</td><td>3.9145 ms</td><td>3.6617 ms</td><td>1.00</td><td>0.02</td><td>5666.6667</td><td>5666.6667</td><td>5666.6667</td><td>1228806.25 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>True</td><td>128.800 ms</td><td>2.2403 ms</td><td>2.0956 ms</td><td>0.62</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>376.66 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>False</td><td>True</td><td>131.364 ms</td><td>2.5987 ms</td><td>3.4692 ms</td><td>0.64</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>1.79 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>False</td><td>202.299 ms</td><td>4.0128 ms</td><td>4.4602 ms</td><td>1.00</td><td>0.03</td><td>5666.6667</td><td>5666.6667</td><td>5666.6667</td><td>1228802.5 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>False</td><td>192.998 ms</td><td>3.4704 ms</td><td>3.2462 ms</td><td>0.95</td><td>0.03</td><td>-</td><td>-</td><td>-</td><td>376.54 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>False</td><td>196.781 ms</td><td>2.7331 ms</td><td>2.5566 ms</td><td>0.97</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>1.72 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>True</td><td>198.984 ms</td><td>3.7743 ms</td><td>3.7068 ms</td><td>1.00</td><td>0.03</td><td>5666.6667</td><td>5666.6667</td><td>5666.6667</td><td>1228806.16 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>True</td><td>183.995 ms</td><td>0.7869 ms</td><td>0.6571 ms</td><td>0.92</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>376.69 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim segmented fill and read&#39;</td><td>209715200</td><td>True</td><td>True</td><td>True</td><td>196.876 ms</td><td>3.5601 ms</td><td>3.3301 ms</td><td>0.99</td><td>0.02</td><td>-</td><td>-</td><td>-</td><td>1.82 KB</td><td>0.000</td>
 </tr></tbody></table>
 </body>
 </html>
diff --git a/Source/Docs/articles/MemoryStreamBenchmarks.SetLoopCountFillAndReadThroughputBenchmarks-report-github.md b/Source/Docs/articles/MemoryStreamBenchmarks.SetLoopCountFillAndReadThroughputBenchmarks-report-github.md
index c684b83..8dcce83 100644
--- a/Source/Docs/articles/MemoryStreamBenchmarks.SetLoopCountFillAndReadThroughputBenchmarks-report-github.md
+++ b/Source/Docs/articles/MemoryStreamBenchmarks.SetLoopCountFillAndReadThroughputBenchmarks-report-github.md
@@ -10,42 +10,42 @@ Intel Core i9-14900K, 1 CPU, 32 logical and 24 physical cores
 ```
 | Method                                                | DataSize  | ZeroBuffers | Mean           | Error        | StdDev       | Ratio | RatioSD | Gen0       | Gen1       | Gen2       | Allocated      | Alloc Ratio |
 |------------------------------------------------------ |---------- |------------ |---------------:|-------------:|-------------:|------:|--------:|-----------:|-----------:|-----------:|---------------:|------------:|
-| **&#39;MemoryStream set loop count fill and read&#39;**           | **131072**    | **False**       |     **2,178.4 μs** |     **42.16 μs** |     **39.44 μs** |  **1.00** |    **0.02** |  **2082.0313** |  **2082.0313** |  **2082.0313** |    **12610.84 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 131072    | False       |       141.9 μs |      0.35 μs |      0.29 μs |  0.07 |    0.00 |     0.7324 |          - |          - |       13.67 KB |       0.001 |
-| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 131072    | False       |       188.5 μs |      1.07 μs |      1.00 μs |  0.09 |    0.00 |     0.7324 |          - |          - |       14.06 KB |       0.001 |
+| **&#39;MemoryStream set loop count fill and read&#39;**           | **131072**    | **False**       |     **2,189.0 μs** |     **12.78 μs** |     **11.95 μs** |  **1.00** |    **0.01** |  **2082.0313** |  **2082.0313** |  **2082.0313** |    **12610.84 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 131072    | False       |       129.8 μs |      0.75 μs |      0.70 μs |  0.06 |    0.00 |     0.7324 |          - |          - |       13.67 KB |       0.001 |
+| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 131072    | False       |       187.5 μs |      0.72 μs |      0.68 μs |  0.09 |    0.00 |     0.7324 |          - |          - |       14.06 KB |       0.001 |
 |                                                       |           |             |                |              |              |       |         |            |            |            |                |             |
-| **&#39;MemoryStream set loop count fill and read&#39;**           | **131072**    | **True**        |     **2,146.4 μs** |     **42.27 μs** |     **41.52 μs** |  **1.00** |    **0.03** |  **2082.0313** |  **2082.0313** |  **2082.0313** |    **12610.84 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 131072    | True        |       207.3 μs |      0.68 μs |      0.57 μs |  0.10 |    0.00 |     0.7324 |          - |          - |       13.67 KB |       0.001 |
-| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 131072    | True        |       308.2 μs |      1.35 μs |      1.26 μs |  0.14 |    0.00 |     0.4883 |          - |          - |       14.06 KB |       0.001 |
+| **&#39;MemoryStream set loop count fill and read&#39;**           | **131072**    | **True**        |     **2,188.4 μs** |     **16.82 μs** |     **15.74 μs** |  **1.00** |    **0.01** |  **2082.0313** |  **2082.0313** |  **2082.0313** |    **12610.84 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 131072    | True        |       208.5 μs |      1.44 μs |      1.34 μs |  0.10 |    0.00 |     0.7324 |          - |          - |       13.67 KB |       0.001 |
+| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 131072    | True        |       313.4 μs |      1.74 μs |      1.63 μs |  0.14 |    0.00 |     0.4883 |          - |          - |       14.06 KB |       0.001 |
 |                                                       |           |             |                |              |              |       |         |            |            |            |                |             |
-| **&#39;MemoryStream set loop count fill and read&#39;**           | **983040**    | **False**       |    **27,419.8 μs** |    **188.39 μs** |    **176.22 μs** |  **1.00** |    **0.01** | **24984.3750** | **24984.3750** | **24984.3750** |   **102221.88 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 983040    | False       |     1,009.6 μs |      3.93 μs |      3.28 μs |  0.04 |    0.00 |     1.9531 |          - |          - |       44.53 KB |       0.000 |
-| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 983040    | False       |     1,128.5 μs |      4.57 μs |      4.27 μs |  0.04 |    0.00 |          - |          - |          - |       14.06 KB |       0.000 |
+| **&#39;MemoryStream set loop count fill and read&#39;**           | **983040**    | **False**       |    **27,584.8 μs** |    **190.65 μs** |    **178.33 μs** |  **1.00** |    **0.01** | **24984.3750** | **24984.3750** | **24984.3750** |   **102221.88 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 983040    | False       |     1,000.8 μs |      4.44 μs |      4.15 μs |  0.04 |    0.00 |     1.9531 |          - |          - |       44.53 KB |       0.000 |
+| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 983040    | False       |     1,091.5 μs |      3.34 μs |      3.13 μs |  0.04 |    0.00 |          - |          - |          - |       14.06 KB |       0.000 |
 |                                                       |           |             |                |              |              |       |         |            |            |            |                |             |
-| **&#39;MemoryStream set loop count fill and read&#39;**           | **983040**    | **True**        |    **27,203.9 μs** |    **175.68 μs** |    **164.33 μs** |  **1.00** |    **0.01** | **24984.3750** | **24984.3750** | **24984.3750** |   **102221.88 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 983040    | True        |     1,586.7 μs |     15.95 μs |     14.92 μs |  0.06 |    0.00 |     1.9531 |          - |          - |       44.53 KB |       0.000 |
-| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 983040    | True        |     1,791.2 μs |      8.74 μs |      7.30 μs |  0.07 |    0.00 |          - |          - |          - |       14.06 KB |       0.000 |
+| **&#39;MemoryStream set loop count fill and read&#39;**           | **983040**    | **True**        |    **27,679.0 μs** |    **154.97 μs** |    **144.96 μs** |  **1.00** |    **0.01** | **24984.3750** | **24984.3750** | **24984.3750** |   **102221.88 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 983040    | True        |     1,588.1 μs |     10.71 μs |     10.02 μs |  0.06 |    0.00 |     1.9531 |          - |          - |       44.53 KB |       0.000 |
+| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 983040    | True        |     1,687.7 μs |     13.90 μs |     13.00 μs |  0.06 |    0.00 |          - |          - |          - |       14.06 KB |       0.000 |
 |                                                       |           |             |                |              |              |       |         |            |            |            |                |             |
-| **&#39;MemoryStream set loop count fill and read&#39;**           | **16777216**  | **False**       |   **280,398.1 μs** |  **5,245.68 μs** |  **4,906.81 μs** |  **1.00** |    **0.02** | **26500.0000** | **26500.0000** | **26500.0000** |  **1638226.95 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 16777216  | False       |    26,840.9 μs |    536.11 μs |    617.39 μs |  0.10 |    0.00 |   187.5000 |          - |          - |     3635.17 KB |       0.002 |
-| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 16777216  | False       |    29,056.1 μs |    494.74 μs |    438.58 μs |  0.10 |    0.00 |          - |          - |          - |       14.07 KB |       0.000 |
+| **&#39;MemoryStream set loop count fill and read&#39;**           | **16777216**  | **False**       |   **284,612.3 μs** |  **5,420.56 μs** |  **5,323.71 μs** |  **1.00** |    **0.03** | **26500.0000** | **26500.0000** | **26500.0000** |  **1638226.95 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 16777216  | False       |    27,028.1 μs |    291.92 μs |    243.76 μs |  0.09 |    0.00 |   187.5000 |          - |          - |     3635.17 KB |       0.002 |
+| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 16777216  | False       |    27,946.7 μs |    549.89 μs |    514.37 μs |  0.10 |    0.00 |          - |          - |          - |       14.07 KB |       0.000 |
 |                                                       |           |             |                |              |              |       |         |            |            |            |                |             |
-| **&#39;MemoryStream set loop count fill and read&#39;**           | **16777216**  | **True**        |   **283,307.6 μs** |  **5,506.57 μs** |  **6,964.04 μs** |  **1.00** |    **0.03** | **74000.0000** | **74000.0000** | **74000.0000** |  **1638242.21 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 16777216  | True        |    41,263.6 μs |    793.92 μs |    779.74 μs |  0.15 |    0.00 |   153.8462 |          - |          - |     3635.19 KB |       0.002 |
-| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 16777216  | True        |    45,778.9 μs |    682.74 μs |    638.64 μs |  0.16 |    0.00 |          - |          - |          - |        14.1 KB |       0.000 |
+| **&#39;MemoryStream set loop count fill and read&#39;**           | **16777216**  | **True**        |   **286,288.4 μs** |  **5,095.76 μs** |  **4,766.58 μs** |  **1.00** |    **0.02** | **26500.0000** | **26500.0000** | **26500.0000** |  **1638226.95 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 16777216  | True        |    41,887.7 μs |    462.75 μs |    432.85 μs |  0.15 |    0.00 |   166.6667 |          - |          - |     3635.19 KB |       0.002 |
+| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 16777216  | True        |    42,174.3 μs |    687.10 μs |    642.72 μs |  0.15 |    0.00 |          - |          - |          - |       14.09 KB |       0.000 |
 |                                                       |           |             |                |              |              |       |         |            |            |            |                |             |
-| **&#39;MemoryStream set loop count fill and read&#39;**           | **100597760** | **False**       | **1,815,965.8 μs** | **23,980.37 μs** | **22,431.25 μs** |  **1.00** |    **0.02** | **29000.0000** | **29000.0000** | **29000.0000** | **13107031.48 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 100597760 | False       |   459,120.2 μs |  4,476.40 μs |  3,968.21 μs |  0.25 |    0.00 |  6000.0000 |          - |          - |   117458.98 KB |       0.009 |
-| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 100597760 | False       |   482,377.9 μs |  6,590.20 μs |  5,145.20 μs |  0.27 |    0.00 |          - |          - |          - |       14.45 KB |       0.000 |
+| **&#39;MemoryStream set loop count fill and read&#39;**           | **100597760** | **False**       | **1,835,445.0 μs** | **12,303.08 μs** | **11,508.31 μs** |  **1.00** |    **0.01** | **29000.0000** | **29000.0000** | **29000.0000** | **13107031.48 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 100597760 | False       |   475,595.6 μs |  6,113.80 μs |  5,718.85 μs |  0.26 |    0.00 |  6000.0000 |          - |          - |   117458.98 KB |       0.009 |
+| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 100597760 | False       |   488,067.7 μs |  9,665.53 μs | 12,223.80 μs |  0.27 |    0.01 |          - |          - |          - |       14.45 KB |       0.000 |
 |                                                       |           |             |                |              |              |       |         |            |            |            |                |             |
-| **&#39;MemoryStream set loop count fill and read&#39;**           | **100597760** | **True**        | **1,807,403.2 μs** | **11,208.85 μs** | **10,484.77 μs** |  **1.00** |    **0.01** | **29000.0000** | **29000.0000** | **29000.0000** | **13107031.48 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 100597760 | True        |   722,276.6 μs | 12,030.32 μs | 11,253.16 μs |  0.40 |    0.01 |  6000.0000 |          - |          - |   117458.66 KB |       0.009 |
-| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 100597760 | True        |   741,095.3 μs | 14,792.65 μs | 17,035.23 μs |  0.41 |    0.01 |          - |          - |          - |       14.45 KB |       0.000 |
+| **&#39;MemoryStream set loop count fill and read&#39;**           | **100597760** | **True**        | **1,819,228.7 μs** |  **6,967.87 μs** |  **6,176.83 μs** |  **1.00** |    **0.00** | **29000.0000** | **29000.0000** | **29000.0000** | **13107031.48 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 100597760 | True        |   737,674.5 μs | 10,244.95 μs |  9,583.13 μs |  0.41 |    0.01 |  6000.0000 |          - |          - |   117458.98 KB |       0.009 |
+| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 100597760 | True        |   723,232.2 μs | 12,026.20 μs | 11,249.31 μs |  0.40 |    0.01 |          - |          - |          - |       14.45 KB |       0.000 |
 |                                                       |           |             |                |              |              |       |         |            |            |            |                |             |
-| **&#39;MemoryStream set loop count fill and read&#39;**           | **209715200** | **False**       | **3,441,390.4 μs** | **22,283.38 μs** | **20,843.89 μs** |  **1.00** |    **0.01** | **30000.0000** | **30000.0000** | **30000.0000** | **26214232.98 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 209715200 | False       | 1,069,621.8 μs | 19,156.30 μs | 17,918.82 μs |  0.31 |    0.01 | 27000.0000 |  4000.0000 |          - |   505323.05 KB |       0.019 |
-| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 209715200 | False       | 1,098,957.3 μs | 12,552.72 μs | 11,127.66 μs |  0.32 |    0.00 |          - |          - |          - |       14.45 KB |       0.000 |
+| **&#39;MemoryStream set loop count fill and read&#39;**           | **209715200** | **False**       | **3,496,994.0 μs** | **29,180.01 μs** | **27,295.00 μs** |  **1.00** |    **0.01** | **30000.0000** | **30000.0000** | **30000.0000** | **26214232.98 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 209715200 | False       | 1,084,895.6 μs | 21,629.28 μs | 32,373.69 μs |  0.31 |    0.01 | 27000.0000 |  4000.0000 |          - |   505323.05 KB |       0.019 |
+| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 209715200 | False       | 1,110,824.8 μs | 19,685.33 μs | 18,413.67 μs |  0.32 |    0.01 |          - |          - |          - |       14.45 KB |       0.000 |
 |                                                       |           |             |                |              |              |       |         |            |            |            |                |             |
-| **&#39;MemoryStream set loop count fill and read&#39;**           | **209715200** | **True**        | **3,412,609.9 μs** | **16,188.89 μs** | **14,351.03 μs** |  **1.00** |    **0.01** | **30000.0000** | **30000.0000** | **30000.0000** | **26214232.98 KB** |       **1.000** |
-| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 209715200 | True        | 1,571,388.3 μs | 15,013.19 μs | 14,043.34 μs |  0.46 |    0.00 | 27000.0000 |  4000.0000 |          - |   505323.05 KB |       0.019 |
-| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 209715200 | True        | 1,654,859.3 μs | 19,586.67 μs | 18,321.39 μs |  0.48 |    0.01 |          - |          - |          - |       14.45 KB |       0.000 |
+| **&#39;MemoryStream set loop count fill and read&#39;**           | **209715200** | **True**        | **3,491,903.1 μs** | **31,207.73 μs** | **29,191.73 μs** |  **1.00** |    **0.01** | **30000.0000** | **30000.0000** | **30000.0000** | **26214232.98 KB** |       **1.000** |
+| &#39;RecyclableMemoryStream set loop count fill and read&#39; | 209715200 | True        | 1,650,876.1 μs | 17,315.58 μs | 16,197.01 μs |  0.47 |    0.01 | 27000.0000 |  4000.0000 |          - |   505322.72 KB |       0.019 |
+| &#39;MemoryStreamSlim set loop count fill and read&#39;       | 209715200 | True        | 1,601,021.2 μs | 13,674.48 μs | 11,418.81 μs |  0.46 |    0.00 |          - |          - |          - |       14.45 KB |       0.000 |
diff --git a/Source/Docs/articles/MemoryStreamBenchmarks.SetLoopCountFillAndReadThroughputBenchmarks-report.html b/Source/Docs/articles/MemoryStreamBenchmarks.SetLoopCountFillAndReadThroughputBenchmarks-report.html
index c0df9f5..82b1112 100644
--- a/Source/Docs/articles/MemoryStreamBenchmarks.SetLoopCountFillAndReadThroughputBenchmarks-report.html
+++ b/Source/Docs/articles/MemoryStreamBenchmarks.SetLoopCountFillAndReadThroughputBenchmarks-report.html
@@ -2,7 +2,7 @@
 <html lang='en'>
 <head>
 <meta charset='utf-8' />
-<title>MemoryStreamBenchmarks.SetLoopCountFillAndReadThroughputBenchmarks-20241011-223407</title>
+<title>MemoryStreamBenchmarks.SetLoopCountFillAndReadThroughputBenchmarks-20241024-213211</title>
 
 <style type="text/css">
 	table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
@@ -24,36 +24,36 @@
 <table>
 <thead><tr><th>Method                                         </th><th>DataSize</th><th>ZeroBuffers</th><th>Mean    </th><th>Error </th><th>StdDev</th><th>Ratio</th><th>RatioSD</th><th>Gen0</th><th>Gen1</th><th>Gen2</th><th>Allocated</th><th>Alloc Ratio</th>
 </tr>
-</thead><tbody><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>131072</td><td>False</td><td>2,178.4 &mu;s</td><td>42.16 &mu;s</td><td>39.44 &mu;s</td><td>1.00</td><td>0.02</td><td>2082.0313</td><td>2082.0313</td><td>2082.0313</td><td>12610.84 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>131072</td><td>False</td><td>141.9 &mu;s</td><td>0.35 &mu;s</td><td>0.29 &mu;s</td><td>0.07</td><td>0.00</td><td>0.7324</td><td>-</td><td>-</td><td>13.67 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>131072</td><td>False</td><td>188.5 &mu;s</td><td>1.07 &mu;s</td><td>1.00 &mu;s</td><td>0.09</td><td>0.00</td><td>0.7324</td><td>-</td><td>-</td><td>14.06 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>131072</td><td>True</td><td>2,146.4 &mu;s</td><td>42.27 &mu;s</td><td>41.52 &mu;s</td><td>1.00</td><td>0.03</td><td>2082.0313</td><td>2082.0313</td><td>2082.0313</td><td>12610.84 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>131072</td><td>True</td><td>207.3 &mu;s</td><td>0.68 &mu;s</td><td>0.57 &mu;s</td><td>0.10</td><td>0.00</td><td>0.7324</td><td>-</td><td>-</td><td>13.67 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>131072</td><td>True</td><td>308.2 &mu;s</td><td>1.35 &mu;s</td><td>1.26 &mu;s</td><td>0.14</td><td>0.00</td><td>0.4883</td><td>-</td><td>-</td><td>14.06 KB</td><td>0.001</td>
-</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>983040</td><td>False</td><td>27,419.8 &mu;s</td><td>188.39 &mu;s</td><td>176.22 &mu;s</td><td>1.00</td><td>0.01</td><td>24984.3750</td><td>24984.3750</td><td>24984.3750</td><td>102221.88 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>983040</td><td>False</td><td>1,009.6 &mu;s</td><td>3.93 &mu;s</td><td>3.28 &mu;s</td><td>0.04</td><td>0.00</td><td>1.9531</td><td>-</td><td>-</td><td>44.53 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>983040</td><td>False</td><td>1,128.5 &mu;s</td><td>4.57 &mu;s</td><td>4.27 &mu;s</td><td>0.04</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>14.06 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>983040</td><td>True</td><td>27,203.9 &mu;s</td><td>175.68 &mu;s</td><td>164.33 &mu;s</td><td>1.00</td><td>0.01</td><td>24984.3750</td><td>24984.3750</td><td>24984.3750</td><td>102221.88 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>983040</td><td>True</td><td>1,586.7 &mu;s</td><td>15.95 &mu;s</td><td>14.92 &mu;s</td><td>0.06</td><td>0.00</td><td>1.9531</td><td>-</td><td>-</td><td>44.53 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>983040</td><td>True</td><td>1,791.2 &mu;s</td><td>8.74 &mu;s</td><td>7.30 &mu;s</td><td>0.07</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>14.06 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>16777216</td><td>False</td><td>280,398.1 &mu;s</td><td>5,245.68 &mu;s</td><td>4,906.81 &mu;s</td><td>1.00</td><td>0.02</td><td>26500.0000</td><td>26500.0000</td><td>26500.0000</td><td>1638226.95 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>16777216</td><td>False</td><td>26,840.9 &mu;s</td><td>536.11 &mu;s</td><td>617.39 &mu;s</td><td>0.10</td><td>0.00</td><td>187.5000</td><td>-</td><td>-</td><td>3635.17 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>16777216</td><td>False</td><td>29,056.1 &mu;s</td><td>494.74 &mu;s</td><td>438.58 &mu;s</td><td>0.10</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>14.07 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>16777216</td><td>True</td><td>283,307.6 &mu;s</td><td>5,506.57 &mu;s</td><td>6,964.04 &mu;s</td><td>1.00</td><td>0.03</td><td>74000.0000</td><td>74000.0000</td><td>74000.0000</td><td>1638242.21 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>16777216</td><td>True</td><td>41,263.6 &mu;s</td><td>793.92 &mu;s</td><td>779.74 &mu;s</td><td>0.15</td><td>0.00</td><td>153.8462</td><td>-</td><td>-</td><td>3635.19 KB</td><td>0.002</td>
-</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>16777216</td><td>True</td><td>45,778.9 &mu;s</td><td>682.74 &mu;s</td><td>638.64 &mu;s</td><td>0.16</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>14.1 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>100597760</td><td>False</td><td>1,815,965.8 &mu;s</td><td>23,980.37 &mu;s</td><td>22,431.25 &mu;s</td><td>1.00</td><td>0.02</td><td>29000.0000</td><td>29000.0000</td><td>29000.0000</td><td>13107031.48 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>100597760</td><td>False</td><td>459,120.2 &mu;s</td><td>4,476.40 &mu;s</td><td>3,968.21 &mu;s</td><td>0.25</td><td>0.00</td><td>6000.0000</td><td>-</td><td>-</td><td>117458.98 KB</td><td>0.009</td>
-</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>100597760</td><td>False</td><td>482,377.9 &mu;s</td><td>6,590.20 &mu;s</td><td>5,145.20 &mu;s</td><td>0.27</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>14.45 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>100597760</td><td>True</td><td>1,807,403.2 &mu;s</td><td>11,208.85 &mu;s</td><td>10,484.77 &mu;s</td><td>1.00</td><td>0.01</td><td>29000.0000</td><td>29000.0000</td><td>29000.0000</td><td>13107031.48 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>100597760</td><td>True</td><td>722,276.6 &mu;s</td><td>12,030.32 &mu;s</td><td>11,253.16 &mu;s</td><td>0.40</td><td>0.01</td><td>6000.0000</td><td>-</td><td>-</td><td>117458.66 KB</td><td>0.009</td>
-</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>100597760</td><td>True</td><td>741,095.3 &mu;s</td><td>14,792.65 &mu;s</td><td>17,035.23 &mu;s</td><td>0.41</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>14.45 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>209715200</td><td>False</td><td>3,441,390.4 &mu;s</td><td>22,283.38 &mu;s</td><td>20,843.89 &mu;s</td><td>1.00</td><td>0.01</td><td>30000.0000</td><td>30000.0000</td><td>30000.0000</td><td>26214232.98 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>209715200</td><td>False</td><td>1,069,621.8 &mu;s</td><td>19,156.30 &mu;s</td><td>17,918.82 &mu;s</td><td>0.31</td><td>0.01</td><td>27000.0000</td><td>4000.0000</td><td>-</td><td>505323.05 KB</td><td>0.019</td>
-</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>209715200</td><td>False</td><td>1,098,957.3 &mu;s</td><td>12,552.72 &mu;s</td><td>11,127.66 &mu;s</td><td>0.32</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>14.45 KB</td><td>0.000</td>
-</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>209715200</td><td>True</td><td>3,412,609.9 &mu;s</td><td>16,188.89 &mu;s</td><td>14,351.03 &mu;s</td><td>1.00</td><td>0.01</td><td>30000.0000</td><td>30000.0000</td><td>30000.0000</td><td>26214232.98 KB</td><td>1.000</td>
-</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>209715200</td><td>True</td><td>1,571,388.3 &mu;s</td><td>15,013.19 &mu;s</td><td>14,043.34 &mu;s</td><td>0.46</td><td>0.00</td><td>27000.0000</td><td>4000.0000</td><td>-</td><td>505323.05 KB</td><td>0.019</td>
-</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>209715200</td><td>True</td><td>1,654,859.3 &mu;s</td><td>19,586.67 &mu;s</td><td>18,321.39 &mu;s</td><td>0.48</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>14.45 KB</td><td>0.000</td>
+</thead><tbody><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>131072</td><td>False</td><td>2,189.0 &mu;s</td><td>12.78 &mu;s</td><td>11.95 &mu;s</td><td>1.00</td><td>0.01</td><td>2082.0313</td><td>2082.0313</td><td>2082.0313</td><td>12610.84 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>131072</td><td>False</td><td>129.8 &mu;s</td><td>0.75 &mu;s</td><td>0.70 &mu;s</td><td>0.06</td><td>0.00</td><td>0.7324</td><td>-</td><td>-</td><td>13.67 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>131072</td><td>False</td><td>187.5 &mu;s</td><td>0.72 &mu;s</td><td>0.68 &mu;s</td><td>0.09</td><td>0.00</td><td>0.7324</td><td>-</td><td>-</td><td>14.06 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>131072</td><td>True</td><td>2,188.4 &mu;s</td><td>16.82 &mu;s</td><td>15.74 &mu;s</td><td>1.00</td><td>0.01</td><td>2082.0313</td><td>2082.0313</td><td>2082.0313</td><td>12610.84 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>131072</td><td>True</td><td>208.5 &mu;s</td><td>1.44 &mu;s</td><td>1.34 &mu;s</td><td>0.10</td><td>0.00</td><td>0.7324</td><td>-</td><td>-</td><td>13.67 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>131072</td><td>True</td><td>313.4 &mu;s</td><td>1.74 &mu;s</td><td>1.63 &mu;s</td><td>0.14</td><td>0.00</td><td>0.4883</td><td>-</td><td>-</td><td>14.06 KB</td><td>0.001</td>
+</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>983040</td><td>False</td><td>27,584.8 &mu;s</td><td>190.65 &mu;s</td><td>178.33 &mu;s</td><td>1.00</td><td>0.01</td><td>24984.3750</td><td>24984.3750</td><td>24984.3750</td><td>102221.88 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>983040</td><td>False</td><td>1,000.8 &mu;s</td><td>4.44 &mu;s</td><td>4.15 &mu;s</td><td>0.04</td><td>0.00</td><td>1.9531</td><td>-</td><td>-</td><td>44.53 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>983040</td><td>False</td><td>1,091.5 &mu;s</td><td>3.34 &mu;s</td><td>3.13 &mu;s</td><td>0.04</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>14.06 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>983040</td><td>True</td><td>27,679.0 &mu;s</td><td>154.97 &mu;s</td><td>144.96 &mu;s</td><td>1.00</td><td>0.01</td><td>24984.3750</td><td>24984.3750</td><td>24984.3750</td><td>102221.88 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>983040</td><td>True</td><td>1,588.1 &mu;s</td><td>10.71 &mu;s</td><td>10.02 &mu;s</td><td>0.06</td><td>0.00</td><td>1.9531</td><td>-</td><td>-</td><td>44.53 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>983040</td><td>True</td><td>1,687.7 &mu;s</td><td>13.90 &mu;s</td><td>13.00 &mu;s</td><td>0.06</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>14.06 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>16777216</td><td>False</td><td>284,612.3 &mu;s</td><td>5,420.56 &mu;s</td><td>5,323.71 &mu;s</td><td>1.00</td><td>0.03</td><td>26500.0000</td><td>26500.0000</td><td>26500.0000</td><td>1638226.95 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>16777216</td><td>False</td><td>27,028.1 &mu;s</td><td>291.92 &mu;s</td><td>243.76 &mu;s</td><td>0.09</td><td>0.00</td><td>187.5000</td><td>-</td><td>-</td><td>3635.17 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>16777216</td><td>False</td><td>27,946.7 &mu;s</td><td>549.89 &mu;s</td><td>514.37 &mu;s</td><td>0.10</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>14.07 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>16777216</td><td>True</td><td>286,288.4 &mu;s</td><td>5,095.76 &mu;s</td><td>4,766.58 &mu;s</td><td>1.00</td><td>0.02</td><td>26500.0000</td><td>26500.0000</td><td>26500.0000</td><td>1638226.95 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>16777216</td><td>True</td><td>41,887.7 &mu;s</td><td>462.75 &mu;s</td><td>432.85 &mu;s</td><td>0.15</td><td>0.00</td><td>166.6667</td><td>-</td><td>-</td><td>3635.19 KB</td><td>0.002</td>
+</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>16777216</td><td>True</td><td>42,174.3 &mu;s</td><td>687.10 &mu;s</td><td>642.72 &mu;s</td><td>0.15</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>14.09 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>100597760</td><td>False</td><td>1,835,445.0 &mu;s</td><td>12,303.08 &mu;s</td><td>11,508.31 &mu;s</td><td>1.00</td><td>0.01</td><td>29000.0000</td><td>29000.0000</td><td>29000.0000</td><td>13107031.48 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>100597760</td><td>False</td><td>475,595.6 &mu;s</td><td>6,113.80 &mu;s</td><td>5,718.85 &mu;s</td><td>0.26</td><td>0.00</td><td>6000.0000</td><td>-</td><td>-</td><td>117458.98 KB</td><td>0.009</td>
+</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>100597760</td><td>False</td><td>488,067.7 &mu;s</td><td>9,665.53 &mu;s</td><td>12,223.80 &mu;s</td><td>0.27</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>14.45 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>100597760</td><td>True</td><td>1,819,228.7 &mu;s</td><td>6,967.87 &mu;s</td><td>6,176.83 &mu;s</td><td>1.00</td><td>0.00</td><td>29000.0000</td><td>29000.0000</td><td>29000.0000</td><td>13107031.48 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>100597760</td><td>True</td><td>737,674.5 &mu;s</td><td>10,244.95 &mu;s</td><td>9,583.13 &mu;s</td><td>0.41</td><td>0.01</td><td>6000.0000</td><td>-</td><td>-</td><td>117458.98 KB</td><td>0.009</td>
+</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>100597760</td><td>True</td><td>723,232.2 &mu;s</td><td>12,026.20 &mu;s</td><td>11,249.31 &mu;s</td><td>0.40</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>14.45 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>209715200</td><td>False</td><td>3,496,994.0 &mu;s</td><td>29,180.01 &mu;s</td><td>27,295.00 &mu;s</td><td>1.00</td><td>0.01</td><td>30000.0000</td><td>30000.0000</td><td>30000.0000</td><td>26214232.98 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>209715200</td><td>False</td><td>1,084,895.6 &mu;s</td><td>21,629.28 &mu;s</td><td>32,373.69 &mu;s</td><td>0.31</td><td>0.01</td><td>27000.0000</td><td>4000.0000</td><td>-</td><td>505323.05 KB</td><td>0.019</td>
+</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>209715200</td><td>False</td><td>1,110,824.8 &mu;s</td><td>19,685.33 &mu;s</td><td>18,413.67 &mu;s</td><td>0.32</td><td>0.01</td><td>-</td><td>-</td><td>-</td><td>14.45 KB</td><td>0.000</td>
+</tr><tr><td>&#39;MemoryStream set loop count fill and read&#39;</td><td>209715200</td><td>True</td><td>3,491,903.1 &mu;s</td><td>31,207.73 &mu;s</td><td>29,191.73 &mu;s</td><td>1.00</td><td>0.01</td><td>30000.0000</td><td>30000.0000</td><td>30000.0000</td><td>26214232.98 KB</td><td>1.000</td>
+</tr><tr><td>&#39;RecyclableMemoryStream set loop count fill and read&#39;</td><td>209715200</td><td>True</td><td>1,650,876.1 &mu;s</td><td>17,315.58 &mu;s</td><td>16,197.01 &mu;s</td><td>0.47</td><td>0.01</td><td>27000.0000</td><td>4000.0000</td><td>-</td><td>505322.72 KB</td><td>0.019</td>
+</tr><tr><td>&#39;MemoryStreamSlim set loop count fill and read&#39;</td><td>209715200</td><td>True</td><td>1,601,021.2 &mu;s</td><td>13,674.48 &mu;s</td><td>11,418.81 &mu;s</td><td>0.46</td><td>0.00</td><td>-</td><td>-</td><td>-</td><td>14.45 KB</td><td>0.000</td>
 </tr></tbody></table>
 </body>
 </html>
diff --git a/Source/Docs/articles/MemoryStreamBenchmarks.WrapperFillAndReadThroughputBenchmarks-report-github.md b/Source/Docs/articles/MemoryStreamBenchmarks.WrapperFillAndReadThroughputBenchmarks-report-github.md
index c654283..37cf463 100644
--- a/Source/Docs/articles/MemoryStreamBenchmarks.WrapperFillAndReadThroughputBenchmarks-report-github.md
+++ b/Source/Docs/articles/MemoryStreamBenchmarks.WrapperFillAndReadThroughputBenchmarks-report-github.md
@@ -8,44 +8,44 @@ Intel Core i9-14900K, 1 CPU, 32 logical and 24 physical cores
 
 
 ```
-| Method                                               | DataSize  | ZeroBuffers | Mean      | Error     | StdDev    | Median    | Ratio | RatioSD | Gen0     | Allocated  | Alloc Ratio |
-|----------------------------------------------------- |---------- |------------ |----------:|----------:|----------:|----------:|------:|--------:|---------:|-----------:|------------:|
-| **&#39;MemoryStream array wrapper fill and read&#39;**           | **131072**    | **False**       |  **59.50 ms** |  **0.120 ms** |  **0.112 ms** |  **59.50 ms** |  **1.00** |    **0.00** |        **-** | **1443.67 KB** |        **1.00** |
-| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 131072    | False       | 105.12 ms |  0.265 ms |  0.248 ms | 105.08 ms |  1.77 |    0.01 | 200.0000 | 6315.94 KB |        4.37 |
-| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 131072    | False       |  57.94 ms |  0.256 ms |  0.240 ms |  57.87 ms |  0.97 |    0.00 | 333.3333 | 6676.81 KB |        4.62 |
-|                                                      |           |             |           |           |           |           |       |         |          |            |             |
-| **&#39;MemoryStream array wrapper fill and read&#39;**           | **131072**    | **True**        |  **59.46 ms** |  **0.223 ms** |  **0.209 ms** |  **59.52 ms** |  **1.00** |    **0.00** |        **-** | **1443.63 KB** |        **1.00** |
-| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 131072    | True        | 133.36 ms |  2.587 ms |  2.541 ms | 133.12 ms |  2.24 |    0.04 | 250.0000 | 6315.96 KB |        4.38 |
-| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 131072    | True        |  58.18 ms |  0.367 ms |  0.343 ms |  58.16 ms |  0.98 |    0.01 | 333.3333 | 6676.81 KB |        4.63 |
-|                                                      |           |             |           |           |           |           |       |         |          |            |             |
-| **&#39;MemoryStream array wrapper fill and read&#39;**           | **983040**    | **False**       |  **63.50 ms** |  **0.497 ms** |  **0.441 ms** |  **63.56 ms** |  **1.00** |    **0.01** |        **-** |  **204.17 KB** |        **1.00** |
-| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 983040    | False       | 112.07 ms |  1.672 ms |  1.564 ms | 112.22 ms |  1.77 |    0.03 |        - | 1760.59 KB |        8.62 |
-| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 983040    | False       |  64.12 ms |  1.258 ms |  2.067 ms |  64.74 ms |  1.01 |    0.03 |        - |  944.12 KB |        4.62 |
-|                                                      |           |             |           |           |           |           |       |         |          |            |             |
-| **&#39;MemoryStream array wrapper fill and read&#39;**           | **983040**    | **True**        |  **63.22 ms** |  **0.396 ms** |  **0.351 ms** |  **63.16 ms** |  **1.00** |    **0.01** |        **-** |  **204.17 KB** |        **1.00** |
-| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 983040    | True        | 145.84 ms |  1.863 ms |  1.743 ms | 145.31 ms |  2.31 |    0.03 |        - | 1760.59 KB |        8.62 |
-| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 983040    | True        |  58.73 ms |  0.614 ms |  0.513 ms |  58.85 ms |  0.93 |    0.01 |        - |  944.12 KB |        4.62 |
-|                                                      |           |             |           |           |           |           |       |         |          |            |             |
-| **&#39;MemoryStream array wrapper fill and read&#39;**           | **16777216**  | **False**       | **106.86 ms** |  **2.109 ms** |  **4.494 ms** | **104.96 ms** |  **1.00** |    **0.06** |        **-** |   **13.02 KB** |        **1.00** |
-| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 16777216  | False       | 241.41 ms |  4.181 ms |  3.911 ms | 240.31 ms |  2.26 |    0.10 |        - | 1083.65 KB |       83.26 |
-| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 16777216  | False       | 106.12 ms |  2.106 ms |  3.460 ms | 105.98 ms |  0.99 |    0.05 |        - |   59.91 KB |        4.60 |
-|                                                      |           |             |           |           |           |           |       |         |          |            |             |
-| **&#39;MemoryStream array wrapper fill and read&#39;**           | **16777216**  | **True**        | **103.23 ms** |  **1.930 ms** |  **2.509 ms** | **102.04 ms** |  **1.00** |    **0.03** |        **-** |   **12.96 KB** |        **1.00** |
-| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 16777216  | True        | 299.49 ms |  1.873 ms |  1.462 ms | 299.50 ms |  2.90 |    0.07 |        - | 1083.71 KB |       83.63 |
-| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 16777216  | True        | 105.39 ms |  2.098 ms |  3.266 ms | 103.88 ms |  1.02 |    0.04 |        - |   59.91 KB |        4.62 |
-|                                                      |           |             |           |           |           |           |       |         |          |            |             |
-| **&#39;MemoryStream array wrapper fill and read&#39;**           | **100597760** | **False**       | **343.56 ms** |  **6.748 ms** | **11.458 ms** | **342.46 ms** |  **1.00** |    **0.05** |        **-** |    **2.64 KB** |        **1.00** |
-| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 100597760 | False       | 610.32 ms | 10.420 ms |  9.747 ms | 606.48 ms |  1.78 |    0.06 |        - | 1088.55 KB |      412.23 |
-| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 100597760 | False       | 323.15 ms |  6.252 ms |  5.849 ms | 322.60 ms |  0.94 |    0.03 |        - |    10.8 KB |        4.09 |
-|                                                      |           |             |           |           |           |           |       |         |          |            |             |
-| **&#39;MemoryStream array wrapper fill and read&#39;**           | **100597760** | **True**        | **333.40 ms** |  **4.456 ms** |  **4.168 ms** | **333.77 ms** |  **1.00** |    **0.02** |        **-** |     **2.3 KB** |        **1.00** |
-| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 100597760 | True        | 758.48 ms |  4.570 ms |  4.051 ms | 757.36 ms |  2.28 |    0.03 |        - | 1088.22 KB |      472.18 |
-| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 100597760 | True        | 325.51 ms |  3.494 ms |  3.268 ms | 324.04 ms |  0.98 |    0.02 |        - |    10.8 KB |        4.68 |
-|                                                      |           |             |           |           |           |           |       |         |          |            |             |
-| **&#39;MemoryStream array wrapper fill and read&#39;**           | **209715200** | **False**       | **351.23 ms** |  **3.172 ms** |  **2.812 ms** | **351.22 ms** |  **1.00** |    **0.01** |        **-** |    **1.45 KB** |        **1.00** |
-| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 209715200 | False       | 629.79 ms |  8.504 ms |  7.955 ms | 630.55 ms |  1.79 |    0.03 |        - | 1066.88 KB |      734.19 |
-| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 209715200 | False       | 361.86 ms |  7.196 ms | 17.102 ms | 359.39 ms |  1.03 |    0.05 |        - |     5.3 KB |        3.65 |
-|                                                      |           |             |           |           |           |           |       |         |          |            |             |
-| **&#39;MemoryStream array wrapper fill and read&#39;**           | **209715200** | **True**        | **363.44 ms** |  **7.097 ms** | **12.798 ms** | **358.58 ms** |  **1.00** |    **0.05** |        **-** |    **1.45 KB** |        **1.00** |
-| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 209715200 | True        | 799.36 ms | 12.229 ms | 11.439 ms | 803.14 ms |  2.20 |    0.08 |        - | 1066.88 KB |      734.19 |
-| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 209715200 | True        | 349.30 ms |  5.338 ms |  4.457 ms | 347.99 ms |  0.96 |    0.03 |        - |     5.3 KB |        3.65 |
+| Method                                               | DataSize  | ZeroBuffers | Mean      | Error    | StdDev    | Ratio | RatioSD | Gen0     | Allocated  | Alloc Ratio |
+|----------------------------------------------------- |---------- |------------ |----------:|---------:|----------:|------:|--------:|---------:|-----------:|------------:|
+| **&#39;MemoryStream array wrapper fill and read&#39;**           | **131072**    | **False**       |  **59.03 ms** | **0.312 ms** |  **0.292 ms** |  **1.00** |    **0.01** |        **-** | **1443.67 KB** |        **1.00** |
+| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 131072    | False       | 106.68 ms | 0.708 ms |  0.628 ms |  1.81 |    0.01 | 200.0000 | 6315.94 KB |        4.37 |
+| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 131072    | False       |  62.58 ms | 1.171 ms |  1.253 ms |  1.06 |    0.02 | 333.3333 | 6676.81 KB |        4.62 |
+|                                                      |           |             |           |          |           |       |         |          |            |             |
+| **&#39;MemoryStream array wrapper fill and read&#39;**           | **131072**    | **True**        |  **60.89 ms** | **0.370 ms** |  **0.346 ms** |  **1.00** |    **0.01** |        **-** | **1445.01 KB** |        **1.00** |
+| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 131072    | True        | 139.14 ms | 1.287 ms |  1.204 ms |  2.29 |    0.02 | 250.0000 | 6315.96 KB |        4.37 |
+| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 131072    | True        |  58.87 ms | 0.332 ms |  0.294 ms |  0.97 |    0.01 | 333.3333 | 6676.81 KB |        4.62 |
+|                                                      |           |             |           |          |           |       |         |          |            |             |
+| **&#39;MemoryStream array wrapper fill and read&#39;**           | **983040**    | **False**       |  **64.01 ms** | **0.610 ms** |  **0.571 ms** |  **1.00** |    **0.01** |        **-** |  **204.17 KB** |        **1.00** |
+| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 983040    | False       | 110.11 ms | 0.740 ms |  0.692 ms |  1.72 |    0.02 |        - | 1760.66 KB |        8.62 |
+| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 983040    | False       |  58.26 ms | 0.381 ms |  0.338 ms |  0.91 |    0.01 |        - |  944.12 KB |        4.62 |
+|                                                      |           |             |           |          |           |       |         |          |            |             |
+| **&#39;MemoryStream array wrapper fill and read&#39;**           | **983040**    | **True**        |  **63.28 ms** | **0.441 ms** |  **0.413 ms** |  **1.00** |    **0.01** |        **-** |  **204.17 KB** |        **1.00** |
+| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 983040    | True        | 147.09 ms | 0.931 ms |  0.870 ms |  2.32 |    0.02 |        - | 1760.68 KB |        8.62 |
+| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 983040    | True        |  64.17 ms | 1.229 ms |  1.641 ms |  1.01 |    0.03 |        - |  944.12 KB |        4.62 |
+|                                                      |           |             |           |          |           |       |         |          |            |             |
+| **&#39;MemoryStream array wrapper fill and read&#39;**           | **16777216**  | **False**       | **111.95 ms** | **2.186 ms** |  **3.272 ms** |  **1.00** |    **0.04** |        **-** |   **13.02 KB** |        **1.00** |
+| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 16777216  | False       | 251.04 ms | 3.175 ms |  2.652 ms |  2.24 |    0.07 |        - | 1083.71 KB |       83.26 |
+| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 16777216  | False       | 109.84 ms | 2.150 ms |  3.014 ms |  0.98 |    0.04 |        - |   59.91 KB |        4.60 |
+|                                                      |           |             |           |          |           |       |         |          |            |             |
+| **&#39;MemoryStream array wrapper fill and read&#39;**           | **16777216**  | **True**        | **110.51 ms** | **2.202 ms** |  **3.619 ms** |  **1.00** |    **0.05** |        **-** |   **13.02 KB** |        **1.00** |
+| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 16777216  | True        | 305.49 ms | 3.454 ms |  3.231 ms |  2.77 |    0.09 |        - | 1083.71 KB |       83.26 |
+| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 16777216  | True        | 108.99 ms | 2.112 ms |  2.891 ms |  0.99 |    0.04 |        - |   59.91 KB |        4.60 |
+|                                                      |           |             |           |          |           |       |         |          |            |             |
+| **&#39;MemoryStream array wrapper fill and read&#39;**           | **100597760** | **False**       | **356.41 ms** | **6.619 ms** |  **6.192 ms** |  **1.00** |    **0.02** |        **-** |    **2.64 KB** |        **1.00** |
+| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 100597760 | False       | 622.39 ms | 4.881 ms |  4.566 ms |  1.75 |    0.03 |        - | 1088.55 KB |      412.23 |
+| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 100597760 | False       | 344.51 ms | 6.665 ms |  9.769 ms |  0.97 |    0.03 |        - |    10.8 KB |        4.09 |
+|                                                      |           |             |           |          |           |       |         |          |            |             |
+| **&#39;MemoryStream array wrapper fill and read&#39;**           | **100597760** | **True**        | **354.11 ms** | **5.549 ms** |  **4.919 ms** |  **1.00** |    **0.02** |        **-** |    **2.45 KB** |        **1.00** |
+| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 100597760 | True        | 778.38 ms | 9.719 ms |  9.091 ms |  2.20 |    0.04 |        - | 1088.55 KB |      445.16 |
+| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 100597760 | True        | 340.54 ms | 4.440 ms |  3.936 ms |  0.96 |    0.02 |        - |    10.8 KB |        4.42 |
+|                                                      |           |             |           |          |           |       |         |          |            |             |
+| **&#39;MemoryStream array wrapper fill and read&#39;**           | **209715200** | **False**       | **363.19 ms** | **6.176 ms** |  **6.865 ms** |  **1.00** |    **0.03** |        **-** |    **1.45 KB** |        **1.00** |
+| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 209715200 | False       | 636.63 ms | 8.349 ms |  7.810 ms |  1.75 |    0.04 |        - | 1066.88 KB |      734.19 |
+| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 209715200 | False       | 385.97 ms | 7.204 ms |  6.739 ms |  1.06 |    0.03 |        - |     5.3 KB |        3.65 |
+|                                                      |           |             |           |          |           |       |         |          |            |             |
+| **&#39;MemoryStream array wrapper fill and read&#39;**           | **209715200** | **True**        | **366.39 ms** | **7.148 ms** | **11.745 ms** |  **1.00** |    **0.04** |        **-** |    **1.45 KB** |        **1.00** |
+| &#39;RecyclableMemoryStream array wrapper fill and read&#39; | 209715200 | True        | 800.63 ms | 6.437 ms |  6.022 ms |  2.19 |    0.07 |        - | 1066.88 KB |      734.19 |
+| &#39;MemoryStreamSlim array wrapper fill and read&#39;       | 209715200 | True        | 378.82 ms | 7.430 ms |  8.845 ms |  1.03 |    0.04 |        - |     5.3 KB |        3.65 |
diff --git a/Source/Docs/articles/MemoryStreamBenchmarks.WrapperFillAndReadThroughputBenchmarks-report.html b/Source/Docs/articles/MemoryStreamBenchmarks.WrapperFillAndReadThroughputBenchmarks-report.html
index 37a0dd1..896170b 100644
--- a/Source/Docs/articles/MemoryStreamBenchmarks.WrapperFillAndReadThroughputBenchmarks-report.html
+++ b/Source/Docs/articles/MemoryStreamBenchmarks.WrapperFillAndReadThroughputBenchmarks-report.html
@@ -2,7 +2,7 @@
 <html lang='en'>
 <head>
 <meta charset='utf-8' />
-<title>MemoryStreamBenchmarks.WrapperFillAndReadThroughputBenchmarks-20241011-224817</title>
+<title>MemoryStreamBenchmarks.WrapperFillAndReadThroughputBenchmarks-20241024-214705</title>
 
 <style type="text/css">
 	table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
@@ -22,38 +22,38 @@
 <pre><code></code></pre>
 
 <table>
-<thead><tr><th>Method                                        </th><th>DataSize</th><th>ZeroBuffers</th><th>Mean</th><th>Error</th><th>StdDev</th><th>Median</th><th>Ratio</th><th>RatioSD</th><th>Gen0</th><th>Allocated</th><th>Alloc Ratio</th>
+<thead><tr><th>Method                                        </th><th>DataSize</th><th>ZeroBuffers</th><th>Mean</th><th>Error</th><th>StdDev</th><th>Ratio</th><th>RatioSD</th><th>Gen0</th><th>Allocated</th><th>Alloc Ratio</th>
 </tr>
-</thead><tbody><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>131072</td><td>False</td><td>59.50 ms</td><td>0.120 ms</td><td>0.112 ms</td><td>59.50 ms</td><td>1.00</td><td>0.00</td><td>-</td><td>1443.67 KB</td><td>1.00</td>
-</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>131072</td><td>False</td><td>105.12 ms</td><td>0.265 ms</td><td>0.248 ms</td><td>105.08 ms</td><td>1.77</td><td>0.01</td><td>200.0000</td><td>6315.94 KB</td><td>4.37</td>
-</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>131072</td><td>False</td><td>57.94 ms</td><td>0.256 ms</td><td>0.240 ms</td><td>57.87 ms</td><td>0.97</td><td>0.00</td><td>333.3333</td><td>6676.81 KB</td><td>4.62</td>
-</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>131072</td><td>True</td><td>59.46 ms</td><td>0.223 ms</td><td>0.209 ms</td><td>59.52 ms</td><td>1.00</td><td>0.00</td><td>-</td><td>1443.63 KB</td><td>1.00</td>
-</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>131072</td><td>True</td><td>133.36 ms</td><td>2.587 ms</td><td>2.541 ms</td><td>133.12 ms</td><td>2.24</td><td>0.04</td><td>250.0000</td><td>6315.96 KB</td><td>4.38</td>
-</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>131072</td><td>True</td><td>58.18 ms</td><td>0.367 ms</td><td>0.343 ms</td><td>58.16 ms</td><td>0.98</td><td>0.01</td><td>333.3333</td><td>6676.81 KB</td><td>4.63</td>
-</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>983040</td><td>False</td><td>63.50 ms</td><td>0.497 ms</td><td>0.441 ms</td><td>63.56 ms</td><td>1.00</td><td>0.01</td><td>-</td><td>204.17 KB</td><td>1.00</td>
-</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>983040</td><td>False</td><td>112.07 ms</td><td>1.672 ms</td><td>1.564 ms</td><td>112.22 ms</td><td>1.77</td><td>0.03</td><td>-</td><td>1760.59 KB</td><td>8.62</td>
-</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>983040</td><td>False</td><td>64.12 ms</td><td>1.258 ms</td><td>2.067 ms</td><td>64.74 ms</td><td>1.01</td><td>0.03</td><td>-</td><td>944.12 KB</td><td>4.62</td>
-</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>983040</td><td>True</td><td>63.22 ms</td><td>0.396 ms</td><td>0.351 ms</td><td>63.16 ms</td><td>1.00</td><td>0.01</td><td>-</td><td>204.17 KB</td><td>1.00</td>
-</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>983040</td><td>True</td><td>145.84 ms</td><td>1.863 ms</td><td>1.743 ms</td><td>145.31 ms</td><td>2.31</td><td>0.03</td><td>-</td><td>1760.59 KB</td><td>8.62</td>
-</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>983040</td><td>True</td><td>58.73 ms</td><td>0.614 ms</td><td>0.513 ms</td><td>58.85 ms</td><td>0.93</td><td>0.01</td><td>-</td><td>944.12 KB</td><td>4.62</td>
-</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>16777216</td><td>False</td><td>106.86 ms</td><td>2.109 ms</td><td>4.494 ms</td><td>104.96 ms</td><td>1.00</td><td>0.06</td><td>-</td><td>13.02 KB</td><td>1.00</td>
-</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>16777216</td><td>False</td><td>241.41 ms</td><td>4.181 ms</td><td>3.911 ms</td><td>240.31 ms</td><td>2.26</td><td>0.10</td><td>-</td><td>1083.65 KB</td><td>83.26</td>
-</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>16777216</td><td>False</td><td>106.12 ms</td><td>2.106 ms</td><td>3.460 ms</td><td>105.98 ms</td><td>0.99</td><td>0.05</td><td>-</td><td>59.91 KB</td><td>4.60</td>
-</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>16777216</td><td>True</td><td>103.23 ms</td><td>1.930 ms</td><td>2.509 ms</td><td>102.04 ms</td><td>1.00</td><td>0.03</td><td>-</td><td>12.96 KB</td><td>1.00</td>
-</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>16777216</td><td>True</td><td>299.49 ms</td><td>1.873 ms</td><td>1.462 ms</td><td>299.50 ms</td><td>2.90</td><td>0.07</td><td>-</td><td>1083.71 KB</td><td>83.63</td>
-</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>16777216</td><td>True</td><td>105.39 ms</td><td>2.098 ms</td><td>3.266 ms</td><td>103.88 ms</td><td>1.02</td><td>0.04</td><td>-</td><td>59.91 KB</td><td>4.62</td>
-</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>100597760</td><td>False</td><td>343.56 ms</td><td>6.748 ms</td><td>11.458 ms</td><td>342.46 ms</td><td>1.00</td><td>0.05</td><td>-</td><td>2.64 KB</td><td>1.00</td>
-</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>100597760</td><td>False</td><td>610.32 ms</td><td>10.420 ms</td><td>9.747 ms</td><td>606.48 ms</td><td>1.78</td><td>0.06</td><td>-</td><td>1088.55 KB</td><td>412.23</td>
-</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>100597760</td><td>False</td><td>323.15 ms</td><td>6.252 ms</td><td>5.849 ms</td><td>322.60 ms</td><td>0.94</td><td>0.03</td><td>-</td><td>10.8 KB</td><td>4.09</td>
-</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>100597760</td><td>True</td><td>333.40 ms</td><td>4.456 ms</td><td>4.168 ms</td><td>333.77 ms</td><td>1.00</td><td>0.02</td><td>-</td><td>2.3 KB</td><td>1.00</td>
-</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>100597760</td><td>True</td><td>758.48 ms</td><td>4.570 ms</td><td>4.051 ms</td><td>757.36 ms</td><td>2.28</td><td>0.03</td><td>-</td><td>1088.22 KB</td><td>472.18</td>
-</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>100597760</td><td>True</td><td>325.51 ms</td><td>3.494 ms</td><td>3.268 ms</td><td>324.04 ms</td><td>0.98</td><td>0.02</td><td>-</td><td>10.8 KB</td><td>4.68</td>
-</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>209715200</td><td>False</td><td>351.23 ms</td><td>3.172 ms</td><td>2.812 ms</td><td>351.22 ms</td><td>1.00</td><td>0.01</td><td>-</td><td>1.45 KB</td><td>1.00</td>
-</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>209715200</td><td>False</td><td>629.79 ms</td><td>8.504 ms</td><td>7.955 ms</td><td>630.55 ms</td><td>1.79</td><td>0.03</td><td>-</td><td>1066.88 KB</td><td>734.19</td>
-</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>209715200</td><td>False</td><td>361.86 ms</td><td>7.196 ms</td><td>17.102 ms</td><td>359.39 ms</td><td>1.03</td><td>0.05</td><td>-</td><td>5.3 KB</td><td>3.65</td>
-</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>209715200</td><td>True</td><td>363.44 ms</td><td>7.097 ms</td><td>12.798 ms</td><td>358.58 ms</td><td>1.00</td><td>0.05</td><td>-</td><td>1.45 KB</td><td>1.00</td>
-</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>209715200</td><td>True</td><td>799.36 ms</td><td>12.229 ms</td><td>11.439 ms</td><td>803.14 ms</td><td>2.20</td><td>0.08</td><td>-</td><td>1066.88 KB</td><td>734.19</td>
-</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>209715200</td><td>True</td><td>349.30 ms</td><td>5.338 ms</td><td>4.457 ms</td><td>347.99 ms</td><td>0.96</td><td>0.03</td><td>-</td><td>5.3 KB</td><td>3.65</td>
+</thead><tbody><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>131072</td><td>False</td><td>59.03 ms</td><td>0.312 ms</td><td>0.292 ms</td><td>1.00</td><td>0.01</td><td>-</td><td>1443.67 KB</td><td>1.00</td>
+</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>131072</td><td>False</td><td>106.68 ms</td><td>0.708 ms</td><td>0.628 ms</td><td>1.81</td><td>0.01</td><td>200.0000</td><td>6315.94 KB</td><td>4.37</td>
+</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>131072</td><td>False</td><td>62.58 ms</td><td>1.171 ms</td><td>1.253 ms</td><td>1.06</td><td>0.02</td><td>333.3333</td><td>6676.81 KB</td><td>4.62</td>
+</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>131072</td><td>True</td><td>60.89 ms</td><td>0.370 ms</td><td>0.346 ms</td><td>1.00</td><td>0.01</td><td>-</td><td>1445.01 KB</td><td>1.00</td>
+</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>131072</td><td>True</td><td>139.14 ms</td><td>1.287 ms</td><td>1.204 ms</td><td>2.29</td><td>0.02</td><td>250.0000</td><td>6315.96 KB</td><td>4.37</td>
+</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>131072</td><td>True</td><td>58.87 ms</td><td>0.332 ms</td><td>0.294 ms</td><td>0.97</td><td>0.01</td><td>333.3333</td><td>6676.81 KB</td><td>4.62</td>
+</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>983040</td><td>False</td><td>64.01 ms</td><td>0.610 ms</td><td>0.571 ms</td><td>1.00</td><td>0.01</td><td>-</td><td>204.17 KB</td><td>1.00</td>
+</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>983040</td><td>False</td><td>110.11 ms</td><td>0.740 ms</td><td>0.692 ms</td><td>1.72</td><td>0.02</td><td>-</td><td>1760.66 KB</td><td>8.62</td>
+</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>983040</td><td>False</td><td>58.26 ms</td><td>0.381 ms</td><td>0.338 ms</td><td>0.91</td><td>0.01</td><td>-</td><td>944.12 KB</td><td>4.62</td>
+</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>983040</td><td>True</td><td>63.28 ms</td><td>0.441 ms</td><td>0.413 ms</td><td>1.00</td><td>0.01</td><td>-</td><td>204.17 KB</td><td>1.00</td>
+</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>983040</td><td>True</td><td>147.09 ms</td><td>0.931 ms</td><td>0.870 ms</td><td>2.32</td><td>0.02</td><td>-</td><td>1760.68 KB</td><td>8.62</td>
+</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>983040</td><td>True</td><td>64.17 ms</td><td>1.229 ms</td><td>1.641 ms</td><td>1.01</td><td>0.03</td><td>-</td><td>944.12 KB</td><td>4.62</td>
+</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>16777216</td><td>False</td><td>111.95 ms</td><td>2.186 ms</td><td>3.272 ms</td><td>1.00</td><td>0.04</td><td>-</td><td>13.02 KB</td><td>1.00</td>
+</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>16777216</td><td>False</td><td>251.04 ms</td><td>3.175 ms</td><td>2.652 ms</td><td>2.24</td><td>0.07</td><td>-</td><td>1083.71 KB</td><td>83.26</td>
+</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>16777216</td><td>False</td><td>109.84 ms</td><td>2.150 ms</td><td>3.014 ms</td><td>0.98</td><td>0.04</td><td>-</td><td>59.91 KB</td><td>4.60</td>
+</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>16777216</td><td>True</td><td>110.51 ms</td><td>2.202 ms</td><td>3.619 ms</td><td>1.00</td><td>0.05</td><td>-</td><td>13.02 KB</td><td>1.00</td>
+</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>16777216</td><td>True</td><td>305.49 ms</td><td>3.454 ms</td><td>3.231 ms</td><td>2.77</td><td>0.09</td><td>-</td><td>1083.71 KB</td><td>83.26</td>
+</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>16777216</td><td>True</td><td>108.99 ms</td><td>2.112 ms</td><td>2.891 ms</td><td>0.99</td><td>0.04</td><td>-</td><td>59.91 KB</td><td>4.60</td>
+</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>100597760</td><td>False</td><td>356.41 ms</td><td>6.619 ms</td><td>6.192 ms</td><td>1.00</td><td>0.02</td><td>-</td><td>2.64 KB</td><td>1.00</td>
+</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>100597760</td><td>False</td><td>622.39 ms</td><td>4.881 ms</td><td>4.566 ms</td><td>1.75</td><td>0.03</td><td>-</td><td>1088.55 KB</td><td>412.23</td>
+</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>100597760</td><td>False</td><td>344.51 ms</td><td>6.665 ms</td><td>9.769 ms</td><td>0.97</td><td>0.03</td><td>-</td><td>10.8 KB</td><td>4.09</td>
+</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>100597760</td><td>True</td><td>354.11 ms</td><td>5.549 ms</td><td>4.919 ms</td><td>1.00</td><td>0.02</td><td>-</td><td>2.45 KB</td><td>1.00</td>
+</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>100597760</td><td>True</td><td>778.38 ms</td><td>9.719 ms</td><td>9.091 ms</td><td>2.20</td><td>0.04</td><td>-</td><td>1088.55 KB</td><td>445.16</td>
+</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>100597760</td><td>True</td><td>340.54 ms</td><td>4.440 ms</td><td>3.936 ms</td><td>0.96</td><td>0.02</td><td>-</td><td>10.8 KB</td><td>4.42</td>
+</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>209715200</td><td>False</td><td>363.19 ms</td><td>6.176 ms</td><td>6.865 ms</td><td>1.00</td><td>0.03</td><td>-</td><td>1.45 KB</td><td>1.00</td>
+</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>209715200</td><td>False</td><td>636.63 ms</td><td>8.349 ms</td><td>7.810 ms</td><td>1.75</td><td>0.04</td><td>-</td><td>1066.88 KB</td><td>734.19</td>
+</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>209715200</td><td>False</td><td>385.97 ms</td><td>7.204 ms</td><td>6.739 ms</td><td>1.06</td><td>0.03</td><td>-</td><td>5.3 KB</td><td>3.65</td>
+</tr><tr><td>&#39;MemoryStream array wrapper fill and read&#39;</td><td>209715200</td><td>True</td><td>366.39 ms</td><td>7.148 ms</td><td>11.745 ms</td><td>1.00</td><td>0.04</td><td>-</td><td>1.45 KB</td><td>1.00</td>
+</tr><tr><td>&#39;RecyclableMemoryStream array wrapper fill and read&#39;</td><td>209715200</td><td>True</td><td>800.63 ms</td><td>6.437 ms</td><td>6.022 ms</td><td>2.19</td><td>0.07</td><td>-</td><td>1066.88 KB</td><td>734.19</td>
+</tr><tr><td>&#39;MemoryStreamSlim array wrapper fill and read&#39;</td><td>209715200</td><td>True</td><td>378.82 ms</td><td>7.430 ms</td><td>8.845 ms</td><td>1.03</td><td>0.04</td><td>-</td><td>5.3 KB</td><td>3.65</td>
 </tr></tbody></table>
 </body>
 </html>
diff --git a/Source/Docs/articles/benchmarks.md b/Source/Docs/articles/benchmarks.md
index 9414607..d218fef 100644
--- a/Source/Docs/articles/benchmarks.md
+++ b/Source/Docs/articles/benchmarks.md
@@ -86,6 +86,6 @@ This is another reason why the ['Set Loop Count'](./set-loop-count-throughput-be
 
 The benchmarks published here used the following versions of the libraries:
 
-- `MemoryStreamSlim` version: 1.0.0
+- `MemoryStreamSlim` version: 1.1.0
 - `RecyclableMemoryStream` version: 3.0.1
 - `MemoryStream` version: .NET 8.0.10
\ No newline at end of file
diff --git a/Source/Docs/articles/copytoasync-throughput-benchmarks.md b/Source/Docs/articles/copytoasync-throughput-benchmarks.md
index 4ac2fa1..ac709e1 100644
--- a/Source/Docs/articles/copytoasync-throughput-benchmarks.md
+++ b/Source/Docs/articles/copytoasync-throughput-benchmarks.md
@@ -13,20 +13,20 @@ Once the stream size approaches 1MB, the `RecyclableMemoryStream` class starts t
 
 By far, the `MemoryStream` class performs the worst in terms of memory allocation performance in this scenario under all conditions.
 
-_Given that file systems managed by the OS and related drivers employ a series of buffer and caching mechanisms, the [emulation](#asynchronous-stream-emulation) approach used in this benchmark is not a perfect representation of the actual performance of the `CopyToAsync` method in a real-world file-based scenario. However, it does provide a means to compare the performance of the different stream classes in a consistent and deterministic way for asynchronous I/O operations that do incur regular asynchronous latencies._
+_Given that file systems managed by the OS and related drivers employ a series of buffer and caching mechanisms, the [emulation](#asynchronous-stream-emulation) approach used in this benchmark is not a perfect representation of the actual performance of the `CopyToAsync` method in a real-world **local** file-based scenario. However, it does provide a means to compare the performance of the different stream classes in a consistent and deterministic way for asynchronous I/O operations that do incur regular asynchronous latencies such as for **network** based files on file servers, etc._
 
 ### Benchmark Operation
 
 A single benchmark operation consists of performing a loop of steps that does the following:
 
 1. Create a new stream instance with a capacity set to the operation data size.
-1. Bulk-write the test data synchronously to the stream.
+1. Write the test data synchronously to the stream (either in a single write or segmented based on the [BulkFile](#bulkfill) parameter).
 1. Call CopyToAsync() on the stream passing a mock asynchronous File I/O stream destination.
 1. Dispose of the stream instance.
 
 The [number of loops](./benchmarks.md#loop-count-impact) in each operation is determined by the [`DataSize`](#datasize) parameter to keep each benchmark reasonably consistent in duration, but the loop count is always the same for all classes being compared for any given DataSize parameter value.
 
-`MemoryStreamSlim` and `RecyclableMemoryStream` classes are created with the option to zero out memory buffers when they are no longer used disabled to keep the benchmark performance focused on the `CopyToAsync()` call. The `MemoryStream` class has no option to zero out memory buffers (used memory is always cleared), so this parameter does not apply to that class.
+`MemoryStreamSlim` and `RecyclableMemoryStream` classes are created with the option to zero out memory buffers when they are no longer used disabled to keep the benchmark performance focused on the `CopyToAsync()` call. The `MemoryStream` class has no option to zero out memory buffers (used memory is always cleared - i.e. internal buffers are allocated with `new byte[]`), so this parameter does not apply to that class.
 
 #### Asynchronous Stream Emulation
 
@@ -48,6 +48,10 @@ The amount of data to write to the stream in each operation loop. The data is a
 
 When `true`, the stream is instantiated with the current loop iteration data size as the initial capacity. When `false`, the stream is created with the default capacity (no initial capacity specified). The results show no notable difference in performance between the two options, but is included in this benchmark to clarify that fact.
 
+#### BulkFill
+
+When `true`, the stream is initially filled with random data in a single bulk write operation. When `false`, the stream is filled with random data in a loop of write operations. The initial stream data fill operation is similar to the operations used in the [Bulk Fill and Read](./dynamic-throughput-benchmarks.md#bulk-fill-and-read) (**BulkFill** is _true_) and [Segmented Fill and Read](./dynamic-throughput-benchmarks.md#segmented-fill-and-read) (**BulkFill** is _false_) benchmarks. The results show no notable difference in performance between the two options, but is included in this benchmark to clarify that fact.
+
 ## Benchmark Results
 
 The results of the benchmarks are found in the [`CopyToAsync()`](./MemoryStreamBenchmarks.CopyToAsyncThroughputBenchmarks-report-github.md) benchmark output.
diff --git a/Source/Docs/articles/getting-started.md b/Source/Docs/articles/getting-started.md
index 3b78bfd..2bd1a4e 100644
--- a/Source/Docs/articles/getting-started.md
+++ b/Source/Docs/articles/getting-started.md
@@ -18,6 +18,23 @@ The [`Memory Monitoring`](./memory-monitoring.md) topic discusses how you can mo
 
 The [`Benchmarks`](./benchmarks.md) topic covers the benchmarks used to examine the performance benefits provided by the `MemoryStreamSlim` class.
 
+## Interlocked Operations
+
+The [`InterlockedOps`](xref:KZDev.PerfUtils.InterlockedOps) class provides a set of static helper methods that provide additional functionality that is not currently available in the `Interlocked` class.
+
+These include operations such as:
+
+* Xor : Exclusive OR operation on any integer types.
+* ClearBits : Clear bits on any integer types.
+* SetBits : Set bits on any integer types.
+* ConditionAnd : Conditionally update bits using an AND operation on any integer types.
+* ConditionOr : Conditionally update bits using an OR operation on any integer types.
+* ConditionXor : Conditionally update bits using an XOR operation on any integer types.
+* ConditionClearBits : Conditionally clear bits on any integer types.
+* ConditionSetBits : Conditionally set bits on any integer types.
+
+The [`Interlocked Operations`](./interlockedops.md) topic discusses these operations in more detail.
+
 ## Future Features
 
-The roadmap plan for this package is to add several additional helpful performance-focused utilities. These will be forthcoming as time permits, so this first release is focused on the `MemoryStreamSlim` class.
+The roadmap plan for this package is to add several additional helpful performance-focused utilities. These will be forthcoming as time permits.
diff --git a/Source/Docs/articles/interlockedops.md b/Source/Docs/articles/interlockedops.md
new file mode 100644
index 0000000..0b715a5
--- /dev/null
+++ b/Source/Docs/articles/interlockedops.md
@@ -0,0 +1,70 @@
+# Interlocked Operations
+
+The `Interlocked` class provides atomic operations for variables that are shared between threads. These operations are guaranteed to be atomic, which means that they are thread-safe and can be used in a multithreaded environment without the need for locks.
+
+The [`InterlockedOps`](xref:KZDev.PerfUtils.InterlockedOps) class provides a set of static helper methods that provide additional functionality that is not currently available in the `Interlocked` class.
+
+All of the operations provided by the `InterlockedOps` class are convenience methods that can be implemented directly in code using the existing `Interlocked` class. However, the `InterlockedOps` class provides a more readable, concise, and consistent way to perform the provided operations than repeatedly copying and pasting code. This can make the code easier to understand and maintain by reducing code duplication.
+
+## Variable Exclusive OR Operations
+
+The `InterlockedOps` class provides the [`Xor`](xref:KZDev.PerfUtils.InterlockedOps.Xor*) method, which performs an atomic XOR operation on a variable, storing the operation result in the provided variable and returning the original value of the variable. This method is useful for toggling an integer variable bit value between `1` and `0` in a thread-safe manner.
+
+The operation can be performed on any integer type, including `int`, `long`, `uint`, and `ulong`.
+
+```csharp
+public class XorExample
+{
+    private int _flag;
+
+    public bool ToggleFlag ()
+    {
+        int originalValue = InterlockedOps.Xor(ref _flag, 1);
+        return originalValue == 0;
+    }
+}
+```
+
+## Variable ClearBits Operations
+
+The [`ClearBits`](xref:KZDev.PerfUtils.InterlockedOps.ClearBits*) methods are used to clear (set to 0) one or more bits that are currently set (set to 1) in a thread-safe atomic operation. The methods return a value tuple of the original value and new value of the variable at the instant the operation was applied.
+
+## Variable SetBits Operations
+
+The [`SetBits`](xref:KZDev.PerfUtils.InterlockedOps.SetBits*) methods are simply semantically clearer equivalents of the `Interlocked` [`Or`](xref:System.Threading.Interlocked.Or*). The one difference is that the `SetBits` method returns a value tuple of the original value and new value of the variable at the instant the operation was applied.
+
+## Conditional Update Operations
+
+The `InterlockedOps` class provides conditional bitwise update operations for [`And`](xref:KZDev.PerfUtils.InterlockedOps.ConditionAnd*), [`Or`](xref:KZDev.PerfUtils.InterlockedOps.ConditionOr*), [`Xor`](xref:KZDev.PerfUtils.InterlockedOps.ConditionXor*), [`ClearBits`](xref:KZDev.PerfUtils.InterlockedOps.ConditionClearBits*), and [`SetBits`](xref:KZDev.PerfUtils.InterlockedOps.ConditionSetBits*) that allow you to update a variable based on a boolean condition. These methods are useful for implementing lock-free algorithms that require atomic updates to a variable that depend on a dynamic condition and guaranteeing that the operation only occurs if the condition is met in a thread-safe manner.
+
+The conditional methods are the same as the non-conditional methods except these methods also take a predicate delegate that gets called with the current value of the variable and the predicate determines of the corresponding operation should be applied based on the value of the variable at that instant. If there is a race condition and the value of the variable is changed by another thread, the predicate delegate will be called again with the new variable value and continue until the newly computed value can be applied, or the predicate returns `false`. 
+
+The conditional methods all return a value type that has the original variable value and the new value at the instant the operation was performed. If the condition predicate returns false, both of the value tuple values will be the same and set to the value of the variable that was passed to the condition predicate that returned false.
+
+There are also overloads of the condition operations that take a predicate argument to avoid closures when the predicate needs additional values to process the conditional logic.
+
+```csharp
+public class ConditionXorExample
+{
+    private int _flags;
+
+    public bool ToggleFlags (Predicate<int> condition, int flagBits)
+    {
+        (int originalValue, int newValue) = InterlockedOps.ConditionXor(ref _flags, condition, flagBits);
+        return originalValue != newValue;
+    }
+}
+```
+
+```csharp
+public class ConditionClearBitsExample
+{
+    private int _flags;
+
+    public bool ClearFlags<T> (Func<int, T, bool> condition, T conditionArgument, int flagBits)
+    {
+        (int originalValue, int newValue) = InterlockedOps.ConditionClearBits(ref _flags, condition, conditionArgument, flagBits);
+        return originalValue != newValue;
+    }
+}
+```
diff --git a/Source/Docs/articles/memorystreamslim.md b/Source/Docs/articles/memorystreamslim.md
index 626df8e..df91c3b 100644
--- a/Source/Docs/articles/memorystreamslim.md
+++ b/Source/Docs/articles/memorystreamslim.md
@@ -1,8 +1,8 @@
 # MemoryStream
 
-The .NET class library provides a `MemoryStream` class representing a stream of bytes stored in memory. It operates two implied modes: expandable (dynamic) or fixed, determined by how you instantiate the `MemoryStream` instance. In expandable mode, the `MemoryStream` class uses a single-byte array to store the data, and the array is resized as needed to accommodate the data as the length and capacity change. In fixed mode, the `MemoryStream` class uses a fixed-size byte array to store the data provided to the constructor during instantiation.
+The .NET class library provides a `MemoryStream` class representing a stream of bytes stored in memory. It operates in one of two implied modes: expandable (dynamic) or fixed, determined by how you instantiate the `MemoryStream` instance. In expandable mode, the `MemoryStream` class uses a single-byte array to store the data, and the array is resized as needed to accommodate the data as the length and capacity change. In fixed mode, the `MemoryStream` class uses a fixed-size byte array to store the data provided to the constructor during instantiation.
 
-The [`MemoryStream`](xref:System.IO.MemoryStream) class is optimized for and works well in fixed mode, providing `Stream` semantics to a byte array you have already allocated. However, in expandable mode, the `MemoryStream` class can result in poor performance and a lot of garbage collection pressure when working with large amounts of memory, many `MemoryStream` instances being created and disposed of frequently, or when the stream instances grow dynamically.
+The [`MemoryStream`](xref:System.IO.MemoryStream) class is optimized for, and works well in, fixed mode, providing `Stream` semantics to a byte array you have already allocated. However, in expandable mode, the `MemoryStream` class can result in poor performance and a lot of garbage collection pressure when working with large amounts of memory, many `MemoryStream` instances being created and disposed of frequently, or when the stream instances grow dynamically.
 
 Microsoft released a separate [`RecyclableMemoryStream`](https://www.nuget.org/packages/Microsoft.IO.RecyclableMemoryStream) package that addresses many issues with the expandable mode of the `MemoryStream` class. Unfortunately, the `RecyclableMemoryStream` package is somewhat cumbersome to use. It also has several limitations, including requiring an application to have consistent usage and behavior patterns and then tune configuration options to those patterns. In some scenarios, this class can also perform much worse than the standard `MemoryStream` class. One mistake with the `RecyclableMemoryStream` class is that it doesn't focus strictly on fixing the expandable mode of the `MemoryStream` class but instead tries to provide a more general-purpose memory stream class that can be used for a fixed mode scenario as well. The issue is that `RecyclableMemoryStream` typically has worse throughput performance than the standard `MemoryStream` class in most fixed-mode scenarios.
 
diff --git a/Source/Docs/articles/toc.yml b/Source/Docs/articles/toc.yml
index 6ae48e1..5411420 100644
--- a/Source/Docs/articles/toc.yml
+++ b/Source/Docs/articles/toc.yml
@@ -1,50 +1,53 @@
 - name: Getting Started
   href: getting-started.md
+- name: Interlocked Operations
+  href: interlockedops.md
 - name: Memory Stream
   href: memorystreamslim.md
-- name: Management
-  href: memory-management.md
-- name: Monitoring
-  href: memory-monitoring.md
-- name: Benchmarks
-  href: benchmarks.md
   items:
-    - name: Dynamic Throughput Benchmarks
-      href: dynamic-throughput-benchmarks.md
+    - name: Memory Management
+      href: memory-management.md
+    - name: Monitoring
+      href: memory-monitoring.md
+    - name: Benchmarks
+      href: benchmarks.md
       items:
-        - name: Bulk Fill And Read
-          href: MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-report-github.md
-        - name: Segmented Fill And Read
-          href: MemoryStreamBenchmarks.SegmentedFillAndReadThroughputBenchmarks-report-github.md
-        - name: Bulk Fill And Read (Full HTML Table)
-          href: MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-report.html
-        - name: Segmented Fill And Read (Full HTML Table)
-          href: MemoryStreamBenchmarks.SegmentedFillAndReadThroughputBenchmarks-report.html
-    - name: Wrapper Throughput Benchmarks
-      href: wrapper-throughput-benchmarks.md
-      items:
-        - name: Benchmark Results
-          href: MemoryStreamBenchmarks.WrapperFillAndReadThroughputBenchmarks-report-github.md
-        - name: Benchmark Results (Full HTML Table)
-          href: MemoryStreamBenchmarks.WrapperFillAndReadThroughputBenchmarks-report.html
-    - name: Continuous Growth Throughput Benchmarks
-      href: continuous-growth-throughput-benchmarks.md
-      items:
-        - name: Benchmark Results
-          href: MemoryStreamBenchmarks.ContinuousGrowFillAndReadThroughputBenchmarks-report-github.md
-        - name: Benchmark Results (Full HTML Table)
-          href: MemoryStreamBenchmarks.ContinuousGrowFillAndReadThroughputBenchmarks-report.html
-    - name: CopyToAsync Throughput Benchmarks
-      href: copytoasync-throughput-benchmarks.md
-      items:
-        - name: Benchmark Results
-          href: MemoryStreamBenchmarks.CopyToAsyncThroughputBenchmarks-report-github.md
-        - name: Benchmark Results (Full HTML Table)
-          href: MemoryStreamBenchmarks.CopyToAsyncThroughputBenchmarks-report.html
-    - name: Set Loop Count Throughput Benchmarks
-      href: set-loop-count-throughput-benchmarks.md
-      items:
-        - name: Benchmark Results
-          href: MemoryStreamBenchmarks.SetLoopCountFillAndReadThroughputBenchmarks-report-github.md
-        - name: Benchmark Results (Full HTML Table)
-          href: MemoryStreamBenchmarks.SetLoopCountFillAndReadThroughputBenchmarks-report.html
+        - name: Dynamic Throughput Benchmarks
+          href: dynamic-throughput-benchmarks.md
+          items:
+            - name: Bulk Fill And Read
+              href: MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-report-github.md
+            - name: Segmented Fill And Read
+              href: MemoryStreamBenchmarks.SegmentedFillAndReadThroughputBenchmarks-report-github.md
+            - name: Bulk Fill And Read (Full HTML Table)
+              href: MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-report.html
+            - name: Segmented Fill And Read (Full HTML Table)
+              href: MemoryStreamBenchmarks.SegmentedFillAndReadThroughputBenchmarks-report.html
+        - name: Wrapper Throughput Benchmarks
+          href: wrapper-throughput-benchmarks.md
+          items:
+            - name: Benchmark Results
+              href: MemoryStreamBenchmarks.WrapperFillAndReadThroughputBenchmarks-report-github.md
+            - name: Benchmark Results (Full HTML Table)
+              href: MemoryStreamBenchmarks.WrapperFillAndReadThroughputBenchmarks-report.html
+        - name: Continuous Growth Throughput Benchmarks
+          href: continuous-growth-throughput-benchmarks.md
+          items:
+            - name: Benchmark Results
+              href: MemoryStreamBenchmarks.ContinuousGrowFillAndReadThroughputBenchmarks-report-github.md
+            - name: Benchmark Results (Full HTML Table)
+              href: MemoryStreamBenchmarks.ContinuousGrowFillAndReadThroughputBenchmarks-report.html
+        - name: CopyToAsync Throughput Benchmarks
+          href: copytoasync-throughput-benchmarks.md
+          items:
+            - name: Benchmark Results
+              href: MemoryStreamBenchmarks.CopyToAsyncThroughputBenchmarks-report-github.md
+            - name: Benchmark Results (Full HTML Table)
+              href: MemoryStreamBenchmarks.CopyToAsyncThroughputBenchmarks-report.html
+        - name: Set Loop Count Throughput Benchmarks
+          href: set-loop-count-throughput-benchmarks.md
+          items:
+            - name: Benchmark Results
+              href: MemoryStreamBenchmarks.SetLoopCountFillAndReadThroughputBenchmarks-report-github.md
+            - name: Benchmark Results (Full HTML Table)
+              href: MemoryStreamBenchmarks.SetLoopCountFillAndReadThroughputBenchmarks-report.html
diff --git a/Source/Docs/index.md b/Source/Docs/index.md
index c33ccb9..7d509f1 100644
--- a/Source/Docs/index.md
+++ b/Source/Docs/index.md
@@ -4,11 +4,13 @@ _layout: landing
 
 # PerfUtils
 
-The `KZDev.PerfUtils` package contains the [`MemoryStreamSlim`](./articles/memorystreamslim.md) class; a high-performance, memory-efficient, easy-to-use replacement for the `MemoryStream` class that provides particular benefits for large or frequently used streams. See the individual [documentation pages](./articles/getting-started.md) and the [API Reference](xref:KZDev.PerfUtils) for more detailed information.
+The `KZDev.PerfUtils` package contains the [`MemoryStreamSlim`](./articles/memorystreamslim.md) class; a high-performance, memory-efficient, easy-to-use replacement for the `MemoryStream` class that provides particular performance benefits for large or frequently used streams. The package also contains the [`InterlockedOps`](./articles/interlockedops.md) class, which provides additional atomic thread-safe operations to extend the functionality of the `Interlocked` class in the .NET Class Library.
+
+See the individual [documentation pages](./articles/getting-started.md) and the [API Reference](xref:KZDev.PerfUtils) for more detailed information.
 
 ## Features
 
-`MemoryStreamSlim` is a drop-in replacement for the `MemoryStream` class use for dynamically sized streams that provides the following benefits:
+`MemoryStreamSlim` is a drop-in replacement for the `MemoryStream` class used for dynamically sized streams that provides the following benefits:
 
 * Throughput performance is better than the standard `MemoryStream`.
 * Much lower memory traffic and far fewer garbage collections than the standard `MemoryStream`.
@@ -16,7 +18,37 @@ The `KZDev.PerfUtils` package contains the [`MemoryStreamSlim`](./articles/memor
 * Simple replacement for `MemoryStream` with the same API, other than the constructor.
 * Optionally allows using native memory for storage, which allows even more flexibility to minimize GC pressure.
 
-## Example
+`InterlockedOps` is a static class providing the following thread-safe atomic operations:
+
+* Xor : Exclusive OR operation on any integer types.
+* ClearBits : Clear bits on any integer types.
+* SetBits : Set bits on any integer types.
+* ConditionAnd : Conditionally update bits using an AND operation on any integer types.
+* ConditionOr : Conditionally update bits using an OR operation on any integer types.
+* ConditionXor : Conditionally update bits using an XOR operation on any integer types.
+* ConditionClearBits : Conditionally clear bits on any integer types.
+* ConditionSetBits : Conditionally set bits on any integer types.
+
+## InterlockedOps Example
+
+Below is an example of how to use the `InterlockedOps` class to perform an atomic XOR operation on an integer variable. The `Xor` method is used to toggle a bit flag between `1` and `0` in a thread-safe manner and returns a boolean value indicating if the bit flag was set to 1.
+
+```csharp
+using KZDev.PerfUtils;
+
+public class XorExample
+{
+    private int _flag;
+
+    public bool ToggleFlag ()
+    {
+        int originalValue = InterlockedOps.Xor(ref _flag, 1);
+        return originalValue == 0;
+    }
+}
+```
+
+## MemoryStreamSlim Example
 
 Below is an example of how to use the `MemoryStreamSlim` class. Other than instantiation using the `Create` method, the API is identical to the standard `MemoryStream` class. It is always a best practice to dispose of the `MemoryStreamSlim` instance when it is no longer needed.
 
@@ -48,10 +80,10 @@ The `MemoryStreamSlim` class is similar in concept and purpose to the [`Recyclab
 * Incur fewer garbage collections.
 * Perform on par or better in terms of throughput performance.
 * Provide more consistent performance across different workloads.
-* Treat security as a priority and opt-out rather than opt-in.
+* Treat security as a priority and opt-out rather than opt-in zero'ing unused memory.
 * Optionally allow using native memory for storage to avoid GC pressure altogether.
 
-One other important difference is that `MemoryStreamSlim` is specifically designed to be used for dynamically sized memory streams and not as a `Stream` wrapper around existing in-memory byte arrays. `RecyclableMemoryStream` is designed to be used in both scenarios, but that approach can lead to some significant performance issues non-deterministic behaviors. This is covered more in the full documentation.
+One other important difference is that `MemoryStreamSlim` is specifically designed to be used for dynamically sized memory streams and not as a `Stream` wrapper around existing in-memory byte arrays. `RecyclableMemoryStream` is designed to be used in both scenarios, but that approach can lead to some significant performance issues and non-deterministic behaviors. This is covered more in the full documentation. Performance comparisons are also available in the [Benchmarks](./articles/benchmarks.md) section.
 
 ## Documentation
 
@@ -59,4 +91,4 @@ Full documentation for the package is available on the [PerfUtils Documentation]
 
 ## Future Features
 
-The roadmap plan for this package is to add a number of additional helpful performance focused utilities. These will be forthcoming as time permits, so this first release is focused just on the `MemoryStreamSlim` class.
+The roadmap plan for this package is to add a number of additional helpful performance focused utilities. These will be forthcoming as time permits.
diff --git a/Source/KZDev.PerfUtils.sln b/Source/KZDev.PerfUtils.sln
index b60a2bb..7078ce3 100644
--- a/Source/KZDev.PerfUtils.sln
+++ b/Source/KZDev.PerfUtils.sln
@@ -23,6 +23,7 @@ EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{F8C76B35-0758-433E-953B-0D7E9D63DE13}"
 	ProjectSection(SolutionItems) = preProject
 		Tst\Directory.Build.props = Tst\Directory.Build.props
+		Src\Directory.Build.props = Src\Directory.Build.props
 		linuxtest.dockerfile = linuxtest.dockerfile
 		Tst\README.md = Tst\README.md
 	EndProjectSection
@@ -77,6 +78,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Articles", "Articles", "{B9
 		Docs\articles\copytoasync-throughput-benchmarks.md = Docs\articles\copytoasync-throughput-benchmarks.md
 		Docs\articles\dynamic-throughput-benchmarks.md = Docs\articles\dynamic-throughput-benchmarks.md
 		Docs\articles\getting-started.md = Docs\articles\getting-started.md
+		Docs\articles\interlockedops.md = Docs\articles\interlockedops.md
 		Docs\articles\memory-management.md = Docs\articles\memory-management.md
 		Docs\articles\memory-monitoring.md = Docs\articles\memory-monitoring.md
 		Docs\articles\MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-report-github.md = Docs\articles\MemoryStreamBenchmarks.BulkFillAndReadThroughputBenchmarks-report-github.md
@@ -97,8 +99,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Articles", "Articles", "{B9
 		Docs\articles\wrapper-throughput-benchmarks.md = Docs\articles\wrapper-throughput-benchmarks.md
 	EndProjectSection
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KZDev.PerfUtils.Memory.Sequential.UnitTests", "Tst\KZDev.PerfUtils.Memory.Sequential.UnitTests\KZDev.PerfUtils.Memory.Sequential.UnitTests.csproj", "{2F0975BB-4074-4764-BD19-39A0F0DDF529}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KZDev.PerfUtils.Memory.Heap.UnitTests", "Tst\KZDev.PerfUtils.Memory.Heap.UnitTests\KZDev.PerfUtils.Memory.Heap.UnitTests.csproj", "{ECB7BCF6-A9DE-45BF-85EC-981304FFA480}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KZDev.PerfUtils.Memory.Native.UnitTests", "Tst\KZDev.PerfUtils.Memory.Native.UnitTests\KZDev.PerfUtils.Memory.Native.UnitTests.csproj", "{E9CF827D-6AC1-4CEF-88E3-746822D9F296}"
@@ -134,6 +134,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WorkFlows", "WorkFlows", "{
 		..\.github\workflows\docfx-publish.yml = ..\.github\workflows\docfx-publish.yml
 	EndProjectSection
 EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KZDev.PerfUtils.Concurrency.UnitTests", "Tst\KZDev.PerfUtils.Concurrency.UnitTests\KZDev.PerfUtils.Concurrency.UnitTests.csproj", "{4770E59B-764A-44BC-B6E3-EB11B335EF7C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KZDev.PerfUtils.Examples", "Dev\KZDev.PerfUtils.Examples\KZDev.PerfUtils.Examples.csproj", "{2F0EF0E2-B9AC-4BEA-9A1D-3855A76F5C48}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -212,14 +216,6 @@ Global
 		{144A1E2B-02BF-4127-BD3A-1163F2C18BA2}.Profile|Any CPU.Build.0 = Profile|Any CPU
 		{144A1E2B-02BF-4127-BD3A-1163F2C18BA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{144A1E2B-02BF-4127-BD3A-1163F2C18BA2}.Release|Any CPU.Build.0 = Release|Any CPU
-		{2F0975BB-4074-4764-BD19-39A0F0DDF529}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{2F0975BB-4074-4764-BD19-39A0F0DDF529}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{2F0975BB-4074-4764-BD19-39A0F0DDF529}.Package|Any CPU.ActiveCfg = Release|Any CPU
-		{2F0975BB-4074-4764-BD19-39A0F0DDF529}.Package|Any CPU.Build.0 = Release|Any CPU
-		{2F0975BB-4074-4764-BD19-39A0F0DDF529}.Profile|Any CPU.ActiveCfg = Profile|Any CPU
-		{2F0975BB-4074-4764-BD19-39A0F0DDF529}.Profile|Any CPU.Build.0 = Profile|Any CPU
-		{2F0975BB-4074-4764-BD19-39A0F0DDF529}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{2F0975BB-4074-4764-BD19-39A0F0DDF529}.Release|Any CPU.Build.0 = Release|Any CPU
 		{ECB7BCF6-A9DE-45BF-85EC-981304FFA480}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{ECB7BCF6-A9DE-45BF-85EC-981304FFA480}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{ECB7BCF6-A9DE-45BF-85EC-981304FFA480}.Package|Any CPU.ActiveCfg = Release|Any CPU
@@ -260,6 +256,22 @@ Global
 		{5D74ECD3-20EC-4049-8C84-D5550E835CD1}.Profile|Any CPU.Build.0 = Profile|Any CPU
 		{5D74ECD3-20EC-4049-8C84-D5550E835CD1}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{5D74ECD3-20EC-4049-8C84-D5550E835CD1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4770E59B-764A-44BC-B6E3-EB11B335EF7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4770E59B-764A-44BC-B6E3-EB11B335EF7C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4770E59B-764A-44BC-B6E3-EB11B335EF7C}.Package|Any CPU.ActiveCfg = Profile|Any CPU
+		{4770E59B-764A-44BC-B6E3-EB11B335EF7C}.Package|Any CPU.Build.0 = Profile|Any CPU
+		{4770E59B-764A-44BC-B6E3-EB11B335EF7C}.Profile|Any CPU.ActiveCfg = Profile|Any CPU
+		{4770E59B-764A-44BC-B6E3-EB11B335EF7C}.Profile|Any CPU.Build.0 = Profile|Any CPU
+		{4770E59B-764A-44BC-B6E3-EB11B335EF7C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4770E59B-764A-44BC-B6E3-EB11B335EF7C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2F0EF0E2-B9AC-4BEA-9A1D-3855A76F5C48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2F0EF0E2-B9AC-4BEA-9A1D-3855A76F5C48}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2F0EF0E2-B9AC-4BEA-9A1D-3855A76F5C48}.Package|Any CPU.ActiveCfg = Profile|Any CPU
+		{2F0EF0E2-B9AC-4BEA-9A1D-3855A76F5C48}.Package|Any CPU.Build.0 = Profile|Any CPU
+		{2F0EF0E2-B9AC-4BEA-9A1D-3855A76F5C48}.Profile|Any CPU.ActiveCfg = Profile|Any CPU
+		{2F0EF0E2-B9AC-4BEA-9A1D-3855A76F5C48}.Profile|Any CPU.Build.0 = Profile|Any CPU
+		{2F0EF0E2-B9AC-4BEA-9A1D-3855A76F5C48}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2F0EF0E2-B9AC-4BEA-9A1D-3855A76F5C48}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -279,7 +291,6 @@ Global
 		{DDB87329-EA4A-421A-9F6F-7408A1AA004B} = {275595B2-9125-41B0-880C-F92366002CC8}
 		{58788936-8D00-4798-B7D0-F30DCBFB4766} = {DDB87329-EA4A-421A-9F6F-7408A1AA004B}
 		{B94D886A-CDE3-4650-908C-4243A5C532B7} = {275595B2-9125-41B0-880C-F92366002CC8}
-		{2F0975BB-4074-4764-BD19-39A0F0DDF529} = {F8C76B35-0758-433E-953B-0D7E9D63DE13}
 		{ECB7BCF6-A9DE-45BF-85EC-981304FFA480} = {F8C76B35-0758-433E-953B-0D7E9D63DE13}
 		{E9CF827D-6AC1-4CEF-88E3-746822D9F296} = {F8C76B35-0758-433E-953B-0D7E9D63DE13}
 		{526D3949-96BC-4C3B-9D0C-6C53D6D7E424} = {30D9D5E1-42BB-4230-8528-A6B339BD14AA}
@@ -290,13 +301,14 @@ Global
 		{5D74ECD3-20EC-4049-8C84-D5550E835CD1} = {F8C76B35-0758-433E-953B-0D7E9D63DE13}
 		{4EFA3802-BA4D-4CA0-B040-B02AE260910D} = {30D9D5E1-42BB-4230-8528-A6B339BD14AA}
 		{42188FFF-1E0E-44F4-9717-D6946CE2CA8E} = {CD9B846B-FEE3-4F43-929C-A4FCBD7D974C}
+		{4770E59B-764A-44BC-B6E3-EB11B335EF7C} = {F8C76B35-0758-433E-953B-0D7E9D63DE13}
+		{2F0EF0E2-B9AC-4BEA-9A1D-3855A76F5C48} = {C95F6A6E-49CC-47F9-AB44-D6904F56D83E}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {FE0AB859-B820-470E-AA57-2337B2495B50}
 	EndGlobalSection
 	GlobalSection(SharedMSBuildProjectFiles) = preSolution
 		Tst\Shared\KZDev.PerfUtils.Memory.Sequential.Tests.Shared\KZDev.PerfUtils.Memory.Sequential.Tests.Shared.projitems*{1674af19-c69d-4082-94a6-c43fb479649e}*SharedItemsImports = 13
-		Tst\Shared\KZDev.PerfUtils.Memory.Tests.Shared\KZDev.PerfUtils.Memory.Shared.projitems*{2f0975bb-4074-4764-bd19-39a0f0ddf529}*SharedItemsImports = 5
 		Tst\Shared\KZDev.PerfUtils.TestMocks.Shared\KZDev.PerfUtils.TestMocks.Shared.projitems*{4efa3802-ba4d-4ca0-b040-b02ae260910d}*SharedItemsImports = 13
 		Tst\Shared\KZDev.PerfUtils.MemoryStreamSlim.Tests.Shared\KZDev.PerfUtils.MemoryStreamSlim.Tests.Shared.projitems*{526d3949-96bc-4c3b-9d0c-6c53d6d7e424}*SharedItemsImports = 13
 		Tst\Shared\KZDev.PerfUtils.Memory.Tests.Shared\KZDev.PerfUtils.Memory.Shared.projitems*{5d74ecd3-20ec-4049-8c84-d5550e835cd1}*SharedItemsImports = 5
@@ -309,8 +321,6 @@ Global
 		Tst\Shared\KZDev.PerfUtils.Memory.Tests.Shared\KZDev.PerfUtils.Memory.Shared.projitems*{81f9cd93-4149-4d87-91e4-650ddd2d83cc}*SharedItemsImports = 5
 		Tst\Shared\KZDev.PerfUtils.Memory.Tests.Shared\KZDev.PerfUtils.Memory.Shared.projitems*{cba74df8-c294-4bc4-a0e5-bad1582da56a}*SharedItemsImports = 13
 		Tst\Shared\KZDev.PerfUtils.Memory.Tests.Shared\KZDev.PerfUtils.Memory.Shared.projitems*{e057e292-e832-49ed-8ad3-fa39e2b15991}*SharedItemsImports = 5
-		Tst\Shared\KZDev.PerfUtils.MemoryStreamSlim.Tests.Shared\KZDev.PerfUtils.MemoryStreamSlim.Tests.Shared.projitems*{e057e292-e832-49ed-8ad3-fa39e2b15991}*SharedItemsImports = 5
-		Tst\Shared\KZDev.PerfUtils.TestMocks.Shared\KZDev.PerfUtils.TestMocks.Shared.projitems*{e057e292-e832-49ed-8ad3-fa39e2b15991}*SharedItemsImports = 5
 		Tst\Shared\KZDev.PerfUtils.Memory.Tests.Shared\KZDev.PerfUtils.Memory.Shared.projitems*{e9cf827d-6ac1-4cef-88e3-746822d9f296}*SharedItemsImports = 5
 		Tst\Shared\KZDev.PerfUtils.MemoryStreamSlim.Tests.Shared\KZDev.PerfUtils.MemoryStreamSlim.Tests.Shared.projitems*{e9cf827d-6ac1-4cef-88e3-746822d9f296}*SharedItemsImports = 5
 		Tst\Shared\KZDev.PerfUtils.TestMocks.Shared\KZDev.PerfUtils.TestMocks.Shared.projitems*{e9cf827d-6ac1-4cef-88e3-746822d9f296}*SharedItemsImports = 5
diff --git a/Source/Perf/Directory.Build.props b/Source/Perf/Directory.Build.props
index fe86fc7..9deceaa 100644
--- a/Source/Perf/Directory.Build.props
+++ b/Source/Perf/Directory.Build.props
@@ -11,4 +11,12 @@
     Import the next higher level Directory.Build.props file. 
    -->
     <Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)..\'))" />
+    <!-- 
+    Define performance project package version properties
+   -->
+    <PropertyGroup Label="PackageVersions">
+		<PerfUtils-Pkg-BenchmarkDotNet>0.14.0</PerfUtils-Pkg-BenchmarkDotNet>
+		<PerfUtils-Pkg-JetBrains_Profiler_Api>1.4.8</PerfUtils-Pkg-JetBrains_Profiler_Api>
+		<PerfUtils-Pkg-Microsoft_IO_RecyclableMemoryStream>3.0.1</PerfUtils-Pkg-Microsoft_IO_RecyclableMemoryStream>
+    </PropertyGroup>
 </Project>
diff --git a/Source/Perf/MemoryStreamBenchmarks/MemoryStreamBenchmarks.csproj b/Source/Perf/MemoryStreamBenchmarks/MemoryStreamBenchmarks.csproj
index 0204729..2356518 100644
--- a/Source/Perf/MemoryStreamBenchmarks/MemoryStreamBenchmarks.csproj
+++ b/Source/Perf/MemoryStreamBenchmarks/MemoryStreamBenchmarks.csproj
@@ -6,8 +6,8 @@
 	</PropertyGroup>
 
 	<ItemGroup>
-		<PackageReference Include="BenchmarkDotNet" Version="0.14.0" />
-		<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.1" />
+		<PackageReference Include="BenchmarkDotNet" Version="$(PerfUtils-Pkg-BenchmarkDotNet)" />
+		<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="$(PerfUtils-Pkg-Microsoft_IO_RecyclableMemoryStream)" />
 	</ItemGroup>
 
 	<ItemGroup>
diff --git a/Source/Perf/MemoryStreamBenchmarks/StreamUtility.cs b/Source/Perf/MemoryStreamBenchmarks/StreamUtility.cs
index 171e2ab..76734dc 100644
--- a/Source/Perf/MemoryStreamBenchmarks/StreamUtility.cs
+++ b/Source/Perf/MemoryStreamBenchmarks/StreamUtility.cs
@@ -25,7 +25,7 @@ public class StreamUtility
         /// <param name="dataLength">
         /// The length of the data to fill and read back
         /// </param>
-        public async Task CopyToAsync (Stream stream, Stream destinationStream, byte[] fillData, 
+        public async Task BulkFillCopyToAsync (Stream stream, Stream destinationStream, byte[] fillData, 
             int dataLength)
         {
             stream.Position = 0;
@@ -47,6 +47,47 @@ public async Task CopyToAsync (Stream stream, Stream destinationStream, byte[] f
         /// <param name="stream">
         /// The stream instance being used.
         /// </param>
+        /// <param name="destinationStream">
+        /// The asynchronous stream to copy the data to
+        /// </param>
+        /// <param name="fillData">
+        /// The test data used to fill the stream
+        /// </param>
+        /// <param name="dataLength">
+        /// The length of the data to fill and read back
+        /// </param>
+        /// <param name="segmentLength">
+        /// The length of the segment to fill with each call and to read back with each call
+        /// </param>
+        public async Task SegmentFillCopyToAsync (Stream stream, Stream destinationStream, byte[] fillData,
+            int dataLength, int segmentLength)
+        {
+            stream.Position = 0;
+            destinationStream.Position = 0;
+
+            int writeSizeLeft = dataLength;
+            while (writeSizeLeft > 0)
+            {
+                int writeSize = Math.Min(writeSizeLeft, segmentLength);
+                // Write synchronously to the source stream to fill it as rapidly as possible
+                // (this is not what we are benchmarking)
+                // ReSharper disable once MethodHasAsyncOverload
+                stream.Write(fillData, 0, writeSize);
+                writeSizeLeft -= writeSize;
+            }
+
+            // Reset the position to the start of the stream for copying
+            stream.Position = 0;
+            // Copy asynchronously to the destination stream
+            await stream.CopyToAsync(destinationStream);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Test to fill the stream with the passed fill data and then read it back into the read buffer
+        /// </summary>
+        /// <param name="stream">
+        /// The stream instance being used.
+        /// </param>
         /// <param name="fillData">
         /// The test data used to fill the stream
         /// </param>
@@ -58,6 +99,7 @@ public async Task CopyToAsync (Stream stream, Stream destinationStream, byte[] f
         /// </param>
         public void BulkFillAndRead (Stream stream, byte[] fillData, byte[] readBuffer, int dataLength)
         {
+            stream.Position = 0;
             stream.Write(fillData, 0, dataLength);
             // Reset the position to the start of the stream for reading
             stream.Position = 0;
@@ -83,8 +125,10 @@ public void BulkFillAndRead (Stream stream, byte[] fillData, byte[] readBuffer,
         /// <param name="segmentLength">
         /// The length of the segment to fill with each call and to read back with each call
         /// </param>
-        public void SegmentFillAndRead (Stream stream, byte[] fillData, byte[] readBuffer, int dataLength, int segmentLength)
+        public void SegmentFillAndRead (Stream stream, byte[] fillData, byte[] readBuffer, 
+            int dataLength, int segmentLength)
         {
+            stream.Position = 0;
             int writeSizeLeft = dataLength;
             while (writeSizeLeft > 0)
             {
diff --git a/Source/Perf/MemoryStreamBenchmarks/ThroughputBenchmarks/CopyToAsyncThroughputBenchmarks.cs b/Source/Perf/MemoryStreamBenchmarks/ThroughputBenchmarks/CopyToAsyncThroughputBenchmarks.cs
index 2323a85..281a3ac 100644
--- a/Source/Perf/MemoryStreamBenchmarks/ThroughputBenchmarks/CopyToAsyncThroughputBenchmarks.cs
+++ b/Source/Perf/MemoryStreamBenchmarks/ThroughputBenchmarks/CopyToAsyncThroughputBenchmarks.cs
@@ -27,6 +27,11 @@ private static int ComputeLoopCount (int dataSize)
             return (int)Math.Max(5, Math.Min(100, 10_000 / Math.Pow(1.3, Math.Log(dataSize, 2))));
         }
 
+        /// <summary>
+        /// The size of the segments to fill and read in.
+        /// </summary>
+        private const int SegmentSize = 0x1000;  // 4KB
+
         /// <summary>
         /// The specifically set loop iteration count for the benchmarks
         /// </summary>
@@ -72,6 +77,12 @@ public int LoopCount
         [ParamsAllValues]
         public bool CapacityOnCreate { get; set; } = false;
 
+        /// <summary>
+        /// Controls if the stream is initially filled with the data in a single operation or in segments
+        /// </summary>
+        [ParamsAllValues]
+        public bool BulkFill { get; set; } = false;
+
         /// <summary>
         /// The different ways to create the stream instances, by specifying capacity or not
         /// </summary>
@@ -101,7 +112,9 @@ public int LoopCount
         /// </param>
         private Task ProcessStreamAsync (Stream stream, int dataLength)
         {
-            return streamUtility.CopyToAsync(stream, _fileStream!, fillData!, dataLength);
+            return BulkFill ? 
+                streamUtility.BulkFillCopyToAsync(stream, _fileStream!, fillData!, dataLength) :
+                streamUtility.SegmentFillCopyToAsync(stream, _fileStream!, fillData!, dataLength, SegmentSize);
         }
         //--------------------------------------------------------------------------------
         /// <summary>
diff --git a/Source/Perf/MemoryStreamProfile/MemoryStreamProfile.csproj b/Source/Perf/MemoryStreamProfile/MemoryStreamProfile.csproj
index d75161e..c895b28 100644
--- a/Source/Perf/MemoryStreamProfile/MemoryStreamProfile.csproj
+++ b/Source/Perf/MemoryStreamProfile/MemoryStreamProfile.csproj
@@ -12,7 +12,7 @@
 	</ItemGroup>
 
 	<ItemGroup>
-		<PackageReference Include="JetBrains.Profiler.Api" Version="1.4.8" />
+		<PackageReference Include="JetBrains.Profiler.Api" Version="$(PerfUtils-Pkg-JetBrains_Profiler_Api)" />
 	</ItemGroup>
 
 	<ItemGroup>
diff --git a/Source/Src/Directory.Build.props b/Source/Src/Directory.Build.props
index a3a71bf..bbb48c4 100644
--- a/Source/Src/Directory.Build.props
+++ b/Source/Src/Directory.Build.props
@@ -9,13 +9,19 @@
     <PropertyGroup Label="SourceGlobals">
         <Configurations>Debug;Release;Profile;Package</Configurations>
         <TargetFrameworks>net8.0;net6.0</TargetFrameworks>
-        <Version>1.0.0</Version>
+        <Version>1.1.0</Version>
         <Authors>Kevin Zehrer</Authors>
         <Copyright>Copyright © 2024 Kevin Zehrer. All rights reserved.</Copyright>
         <Product>KZDev Performance Utilities</Product>
         <PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
     </PropertyGroup>
-    <PropertyGroup Condition=" '$(Configuration)'=='Package' ">
+    <!-- 
+    Define source code project package version properties
+   -->
+    <PropertyGroup Condition="'$(TargetFramework)' != 'net8.0'">
+		<PerfUtils-Pkg-System_Diagnostics_DiagnosticSource>8.0.1</PerfUtils-Pkg-System_Diagnostics_DiagnosticSource>
+    </PropertyGroup>
+	<PropertyGroup Condition=" '$(Configuration)'=='Package' ">
         <IsPacking>true</IsPacking>
     </PropertyGroup>
     <PropertyGroup Condition=" '$(IsPacking)'=='' AND '$(Configuration)'!='Package' ">
diff --git a/Source/Src/KZDev.PerfUtils/Concurrency/InterlockedOps.cs b/Source/Src/KZDev.PerfUtils/Concurrency/InterlockedOps.cs
new file mode 100644
index 0000000..dbf6cbb
--- /dev/null
+++ b/Source/Src/KZDev.PerfUtils/Concurrency/InterlockedOps.cs
@@ -0,0 +1,2395 @@
+// Copyright (c) Kevin Zehrer
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+
+using System.Runtime.CompilerServices;
+
+namespace KZDev.PerfUtils
+{
+    //################################################################################
+    /// <summary>
+    /// A collection of helper methods for atomic operations.
+    /// </summary>
+    public static class InterlockedOps
+    {
+        #region Xor
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe exclusive OR operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// The original value in <paramref name="location1"/>
+        /// </returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static int Xor (ref int location1, int value)
+        {
+            int original, result;
+            do
+            {
+                original = location1;
+                result = original ^ value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return original;
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe exclusive OR operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// The original value in <paramref name="location1"/>
+        /// </returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static uint Xor (ref uint location1, uint value)
+        {
+            uint original, result;
+            do
+            {
+                original = location1;
+                result = original ^ value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return original;
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe exclusive OR operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// The original value in <paramref name="location1"/>
+        /// </returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static long Xor (ref long location1, long value)
+        {
+            long original, result;
+            do
+            {
+                original = location1;
+                result = original ^ value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return original;
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe exclusive OR operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// The original value in <paramref name="location1"/>
+        /// </returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static ulong Xor (ref ulong location1, ulong value)
+        {
+            ulong original, result;
+            do
+            {
+                original = location1;
+                result = original ^ value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return original;
+        }
+        //--------------------------------------------------------------------------------
+
+        #endregion Xor
+
+        #region SetBits
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to set a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to set. The result is stored in this variable.
+        /// </param>
+        /// <param name="setBitsValue">
+        /// The value that holds the bits to set and store in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// </returns>
+        /// <remarks>
+        /// This is a convenience method that uses the <see cref="Interlocked.Or(ref int, int)"/>
+        /// operation to set the bits, and returns the original and new values.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (int originalValue, int newValue) SetBits (ref int location1, int setBitsValue)
+        {
+            int original = Interlocked.Or(ref location1, setBitsValue);
+            return (original, original | setBitsValue);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to set a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to set. The result is stored in this variable.
+        /// </param>
+        /// <param name="setBitsValue">
+        /// The value that holds the bits to set and store in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// </returns>
+        /// <remarks>
+        /// This is a convenience method that uses the <see cref="Interlocked.Or(ref int, int)"/>
+        /// operation to set the bits, and returns the original and new values.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (uint originalValue, uint newValue) SetBits (ref uint location1, uint setBitsValue)
+        {
+            uint original = Interlocked.Or(ref location1, setBitsValue);
+            return (original, original | setBitsValue);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to set a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to set. The result is stored in this variable.
+        /// </param>
+        /// <param name="setBitsValue">
+        /// The value that holds the bits to set and store in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// </returns>
+        /// <remarks>
+        /// This is a convenience method that uses the <see cref="Interlocked.Or(ref int, int)"/>
+        /// operation to set the bits, and returns the original and new values.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (long originalValue, long newValue) SetBits (ref long location1, long setBitsValue)
+        {
+            long original = Interlocked.Or(ref location1, setBitsValue);
+            return (original, original | setBitsValue);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to set a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to set. The result is stored in this variable.
+        /// </param>
+        /// <param name="setBitsValue">
+        /// The value that holds the bits to set and store in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// </returns>
+        /// <remarks>
+        /// This is a convenience method that uses the <see cref="Interlocked.Or(ref int, int)"/>
+        /// operation to set the bits, and returns the original and new values.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (ulong originalValue, ulong newValue) SetBits (ref ulong location1, ulong setBitsValue)
+        {
+            ulong original = Interlocked.Or(ref location1, setBitsValue);
+            return (original, original | setBitsValue);
+        }
+        //--------------------------------------------------------------------------------
+
+        #endregion SetBits
+
+        #region ClearBits
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to clear a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to clear. The result is stored in this variable.
+        /// </param>
+        /// <param name="clearBitsValue">
+        /// The value that holds the bits to clear in <paramref name="location1"/>. All the 
+        /// bits set in this value will be cleared in <paramref name="location1"/>.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// </returns>
+        /// <remarks>
+        /// This is a convenience method that could be done with <see cref="Interlocked.And(ref int, int)"/>
+        /// passing the bitwise complement of the <paramref name="clearBitsValue"/>, but this 
+        /// method returns the original and new values in a tuple.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (int originalValue, int newValue) ClearBits (ref int location1, int clearBitsValue)
+        {
+            int original, result;
+            do
+            {
+                original = location1;
+                result = original & ~clearBitsValue;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to clear a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to clear. The result is stored in this variable.
+        /// </param>
+        /// <param name="clearBitsValue">
+        /// The value that holds the bits to clear in <paramref name="location1"/>. All the 
+        /// bits set in this value will be cleared in <paramref name="location1"/>.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// </returns>
+        /// <remarks>
+        /// This is a convenience method that could be done with <see cref="Interlocked.And(ref int, int)"/>
+        /// passing the bitwise complement of the <paramref name="clearBitsValue"/>, but this 
+        /// method returns the original and new values in a tuple.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (uint originalValue, uint newValue) ClearBits (ref uint location1, uint clearBitsValue)
+        {
+            uint original, result;
+            do
+            {
+                original = location1;
+                result = original & ~clearBitsValue;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to clear a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to clear. The result is stored in this variable.
+        /// </param>
+        /// <param name="clearBitsValue">
+        /// The value that holds the bits to clear in <paramref name="location1"/>. All the 
+        /// bits set in this value will be cleared in <paramref name="location1"/>.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// </returns>
+        /// <remarks>
+        /// This is a convenience method that could be done with <see cref="Interlocked.And(ref int, int)"/>
+        /// passing the bitwise complement of the <paramref name="clearBitsValue"/>, but this 
+        /// method returns the original and new values in a tuple.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (long originalValue, long newValue) ClearBits (ref long location1, long clearBitsValue)
+        {
+            long original, result;
+            do
+            {
+                original = location1;
+                result = original & ~clearBitsValue;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to clear a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to clear. The result is stored in this variable.
+        /// </param>
+        /// <param name="clearBitsValue">
+        /// The value that holds the bits to clear in <paramref name="location1"/>. All the 
+        /// bits set in this value will be cleared in <paramref name="location1"/>.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// </returns>
+        /// <remarks>
+        /// This is a convenience method that could be done with <see cref="Interlocked.And(ref int, int)"/>
+        /// passing the bitwise complement of the <paramref name="clearBitsValue"/>, but this 
+        /// method returns the original and new values in a tuple.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (ulong originalValue, ulong newValue) ClearBits (ref ulong location1, ulong clearBitsValue)
+        {
+            ulong original, result;
+            do
+            {
+                original = location1;
+                result = original & ~clearBitsValue;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+
+        #endregion ClearBits
+
+        #region Conditional Xor
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional exclusive OR operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (int originalValue, int newValue) ConditionXor (ref int location1,
+            Predicate<int> condition, int value)
+        {
+            int original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original))
+                {
+                    return (original, original);
+                }
+                result = original ^ value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional exclusive OR operation on a variable value with the
+        /// condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (int originalValue, int newValue) ConditionXor<T> (ref int location1,
+            Func<int, T, bool> condition, T argument, int value)
+        {
+            int original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original, argument))
+                {
+                    return (original, original);
+                }
+                result = original ^ value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional exclusive OR operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (uint originalValue, uint newValue) ConditionXor (ref uint location1,
+            Predicate<uint> condition, uint value)
+        {
+            uint original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original))
+                {
+                    return (original, original);
+                }
+                result = original ^ value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional exclusive OR operation on a variable value with the
+        /// condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (uint originalValue, uint newValue) ConditionXor<T> (ref uint location1,
+            Func<uint, T, bool> condition, T argument, uint value)
+        {
+            uint original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original, argument))
+                {
+                    return (original, original);
+                }
+                result = original ^ value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional exclusive OR operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (long originalValue, long newValue) ConditionXor (ref long location1,
+            Predicate<long> condition, long value)
+        {
+            long original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original))
+                {
+                    return (original, original);
+                }
+                result = original ^ value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional exclusive OR operation on a variable value with the
+        /// condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (long originalValue, long newValue) ConditionXor<T> (ref long location1,
+            Func<long, T, bool> condition, T argument, long value)
+        {
+            long original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original, argument))
+                {
+                    return (original, original);
+                }
+                result = original ^ value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional exclusive OR operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (ulong originalValue, ulong newValue) ConditionXor (ref ulong location1,
+            Predicate<ulong> condition, ulong value)
+        {
+            ulong original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original))
+                {
+                    return (original, original);
+                }
+                result = original ^ value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional exclusive OR operation on a variable value with the
+        /// condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (ulong originalValue, ulong newValue) ConditionXor<T> (ref ulong location1,
+            Func<ulong, T, bool> condition, T argument, ulong value)
+        {
+            ulong original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original, argument))
+                {
+                    return (original, original);
+                }
+                result = original ^ value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+
+        #endregion Conditional Xor
+
+        #region Conditional And
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional AND operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (int originalValue, int newValue) ConditionAnd (ref int location1,
+            Predicate<int> condition, int value)
+        {
+            int original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original))
+                {
+                    return (original, original);
+                }
+                result = original & value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional AND operation on a variable value with the
+        /// condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the AND
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (int originalValue, int newValue) ConditionAnd<T> (ref int location1,
+            Func<int, T, bool> condition, T argument, int value)
+        {
+            int original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original, argument))
+                {
+                    return (original, original);
+                }
+                result = original & value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional AND operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (uint originalValue, uint newValue) ConditionAnd (ref uint location1,
+            Predicate<uint> condition, uint value)
+        {
+            uint original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original))
+                {
+                    return (original, original);
+                }
+                result = original & value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional AND operation on a variable value with the
+        /// condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the AND
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (uint originalValue, uint newValue) ConditionAnd<T> (ref uint location1,
+            Func<uint, T, bool> condition, T argument, uint value)
+        {
+            uint original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original, argument))
+                {
+                    return (original, original);
+                }
+                result = original & value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional AND operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (long originalValue, long newValue) ConditionAnd (ref long location1,
+            Predicate<long> condition, long value)
+        {
+            long original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original))
+                {
+                    return (original, original);
+                }
+                result = original & value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional AND operation on a variable value with the
+        /// condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the AND
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (long originalValue, long newValue) ConditionAnd<T> (ref long location1,
+            Func<long, T, bool> condition, T argument, long value)
+        {
+            long original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original, argument))
+                {
+                    return (original, original);
+                }
+                result = original & value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional AND operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (ulong originalValue, ulong newValue) ConditionAnd (ref ulong location1,
+            Predicate<ulong> condition, ulong value)
+        {
+            ulong original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original))
+                {
+                    return (original, original);
+                }
+                result = original & value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional AND operation on a variable value with the
+        /// condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the AND
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (ulong originalValue, ulong newValue) ConditionAnd<T> (ref ulong location1,
+            Func<ulong, T, bool> condition, T argument, ulong value)
+        {
+            ulong original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original, argument))
+                {
+                    return (original, original);
+                }
+                result = original & value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+
+        #endregion Conditional And
+
+        #region Conditional Or
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional OR operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (int originalValue, int newValue) ConditionOr (ref int location1,
+            Predicate<int> condition, int value)
+        {
+            int original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original))
+                {
+                    return (original, original);
+                }
+                result = original | value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional OR operation on a variable value with the
+        /// condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the OR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (int originalValue, int newValue) ConditionOr<T> (ref int location1,
+            Func<int, T, bool> condition, T argument, int value)
+        {
+            int original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original, argument))
+                {
+                    return (original, original);
+                }
+                result = original | value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional OR operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (uint originalValue, uint newValue) ConditionOr (ref uint location1,
+            Predicate<uint> condition, uint value)
+        {
+            uint original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original))
+                {
+                    return (original, original);
+                }
+                result = original | value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional OR operation on a variable value with the
+        /// condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the OR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (uint originalValue, uint newValue) ConditionOr<T> (ref uint location1,
+            Func<uint, T, bool> condition, T argument, uint value)
+        {
+            uint original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original, argument))
+                {
+                    return (original, original);
+                }
+                result = original | value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional OR operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (long originalValue, long newValue) ConditionOr (ref long location1,
+            Predicate<long> condition, long value)
+        {
+            long original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original))
+                {
+                    return (original, original);
+                }
+                result = original | value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional OR operation on a variable value with the
+        /// condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the OR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (long originalValue, long newValue) ConditionOr<T> (ref long location1,
+            Func<long, T, bool> condition, T argument, long value)
+        {
+            long original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original, argument))
+                {
+                    return (original, original);
+                }
+                result = original | value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional OR operation on a variable value.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (ulong originalValue, ulong newValue) ConditionOr (ref ulong location1,
+            Predicate<ulong> condition, ulong value)
+        {
+            ulong original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original))
+                {
+                    return (original, original);
+                }
+                result = original | value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe conditional OR operation on a variable value with the
+        /// condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the first value to perform the XOR operation on. The result
+        /// is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="value">
+        /// The value to be combined with the value in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the OR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (ulong originalValue, ulong newValue) ConditionOr<T> (ref ulong location1,
+            Func<ulong, T, bool> condition, T argument, ulong value)
+        {
+            ulong original, result;
+            do
+            {
+                original = location1;
+                if (!condition(original, argument))
+                {
+                    return (original, original);
+                }
+                result = original | value;
+            }
+            while (Interlocked.CompareExchange(ref location1, result, original) != original);
+            return (original, result);
+        }
+        //--------------------------------------------------------------------------------
+
+        #endregion Conditional Or
+
+        #region Conditional SetBits
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally set a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to set. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="setBitsValue">
+        /// The value that holds the bits to set and store in <paramref name="location1"/>
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionOr(ref int, Predicate{int}, int)"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (int originalValue, int newValue) ConditionSetBits (ref int location1,
+            Predicate<int> condition, int setBitsValue) => ConditionOr(ref location1, condition, setBitsValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally set a specific set of bits in a variable
+        /// with the condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the bits to set. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="setBitsValue">
+        /// The value that holds the bits to set and store in <paramref name="location1"/>
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionOr{T}(ref int, Func{int, T, bool}, T, int)"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (int originalValue, int newValue) ConditionSetBits<T> (ref int location1,
+            Func<int, T, bool> condition, T argument, int setBitsValue) =>
+            ConditionOr(ref location1, condition, argument, setBitsValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally set a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to set. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="setBitsValue">
+        /// The value that holds the bits to set and store in <paramref name="location1"/>
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionOr(ref uint, Predicate{uint}, uint)"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (uint originalValue, uint newValue) ConditionSetBits (ref uint location1,
+            Predicate<uint> condition, uint setBitsValue) => ConditionOr(ref location1, condition, setBitsValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally set a specific set of bits in a variable
+        /// with the condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the bits to set. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="setBitsValue">
+        /// The value that holds the bits to set and store in <paramref name="location1"/>
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionOr{T}(ref uint, Func{uint, T, bool}, T, uint)"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (uint originalValue, uint newValue) ConditionSetBits<T> (ref uint location1,
+            Func<uint, T, bool> condition, T argument, uint setBitsValue) =>
+            ConditionOr(ref location1, condition, argument, setBitsValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally set a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to set. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="setBitsValue">
+        /// The value that holds the bits to set and store in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionOr(ref long, Predicate{long}, long)"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (long originalValue, long newValue) ConditionSetBits (ref long location1,
+            Predicate<long> condition, long setBitsValue) => ConditionOr(ref location1, condition, setBitsValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally set a specific set of bits in a variable
+        /// with the condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the bits to set. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="setBitsValue">
+        /// The value that holds the bits to set and store in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionOr{T}(ref long, Func{long, T, bool}, T, long)"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (long originalValue, long newValue) ConditionSetBits<T> (ref long location1,
+            Func<long, T, bool> condition, T argument, long setBitsValue) =>
+            ConditionOr(ref location1, condition, argument, setBitsValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally set a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to set. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="setBitsValue">
+        /// The value that holds the bits to set and store in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionOr(ref ulong, Predicate{ulong}, ulong)"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (ulong originalValue, ulong newValue) ConditionSetBits (ref ulong location1,
+            Predicate<ulong> condition, ulong setBitsValue) => ConditionOr(ref location1, condition, setBitsValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally set a specific set of bits in a variable
+        /// with the condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the bits to set. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="setBitsValue">
+        /// The value that holds the bits to set and store in <paramref name="location1"/>
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionOr{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (ulong originalValue, ulong newValue) ConditionSetBits<T> (ref ulong location1,
+            Func<ulong, T, bool> condition, T argument, ulong setBitsValue) =>
+            ConditionOr(ref location1, condition, argument, setBitsValue);
+        //--------------------------------------------------------------------------------
+
+        #endregion Conditional SetBits
+
+        #region Conditional ClearBits
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally clear a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to clear. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="clearBitsValue">
+        /// The value that holds the bits to clear in <paramref name="location1"/>. All the 
+        /// bits set in this value will be cleared in <paramref name="location1"/>.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionAnd(ref int, Predicate{int}, int)"/> with the
+        /// bitwise complement of <paramref name="clearBitsValue"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (int originalValue, int newValue) ConditionClearBits (ref int location1,
+            Predicate<int> condition, int clearBitsValue) => ConditionAnd(ref location1, condition, ~clearBitsValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally clear a specific set of bits in a variable
+        /// with the condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the bits to clear. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="clearBitsValue">
+        /// The value that holds the bits to clear in <paramref name="location1"/>. All the 
+        /// bits set in this value will be cleared in <paramref name="location1"/>.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionAnd{T}(ref int, Func{int, T, bool}, T, int)"/> with the
+        /// bitwise complement of <paramref name="clearBitsValue"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (int originalValue, int newValue) ConditionClearBits<T> (ref int location1,
+            Func<int, T, bool> condition, T argument, int clearBitsValue) =>
+            ConditionAnd(ref location1, condition, argument, ~clearBitsValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally clear a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to clear. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="clearBitsValue">
+        /// The value that holds the bits to clear in <paramref name="location1"/>. All the 
+        /// bits set in this value will be cleared in <paramref name="location1"/>.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionAnd(ref uint, Predicate{uint}, uint)"/> with the
+        /// bitwise complement of <paramref name="clearBitsValue"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (uint originalValue, uint newValue) ConditionClearBits (ref uint location1,
+            Predicate<uint> condition, uint clearBitsValue) => ConditionAnd(ref location1, condition, ~clearBitsValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally clear a specific set of bits in a variable
+        /// with the condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the bits to clear. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="clearBitsValue">
+        /// The value that holds the bits to clear in <paramref name="location1"/>. All the 
+        /// bits set in this value will be cleared in <paramref name="location1"/>.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionAnd{T}(ref uint, Func{uint, T, bool}, T, uint)"/> with the
+        /// bitwise complement of <paramref name="clearBitsValue"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (uint originalValue, uint newValue) ConditionClearBits<T> (ref uint location1,
+            Func<uint, T, bool> condition, T argument, uint clearBitsValue) =>
+            ConditionAnd(ref location1, condition, argument, ~clearBitsValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally clear a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to clear. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="clearBitsValue">
+        /// The value that holds the bits to clear in <paramref name="location1"/>. All the 
+        /// bits set in this value will be cleared in <paramref name="location1"/>.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionAnd(ref long, Predicate{long}, long)"/> with the
+        /// bitwise complement of <paramref name="clearBitsValue"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (long originalValue, long newValue) ConditionClearBits (ref long location1,
+            Predicate<long> condition, long clearBitsValue) => ConditionAnd(ref location1, condition, ~clearBitsValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally clear a specific set of bits in a variable
+        /// with the condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the bits to clear. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="clearBitsValue">
+        /// The value that holds the bits to clear in <paramref name="location1"/>. All the 
+        /// bits set in this value will be cleared in <paramref name="location1"/>.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionAnd{T}(ref long, Func{long, T, bool}, T, long)"/> with the
+        /// bitwise complement of <paramref name="clearBitsValue"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (long originalValue, long newValue) ConditionClearBits<T> (ref long location1,
+            Func<long, T, bool> condition, T argument, long clearBitsValue) =>
+            ConditionAnd(ref location1, condition, argument, ~clearBitsValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally clear a specific set of bits in a variable.
+        /// </summary>
+        /// <param name="location1">
+        /// A variable containing the bits to clear. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="clearBitsValue">
+        /// The value that holds the bits to clear in <paramref name="location1"/>. All the 
+        /// bits set in this value will be cleared in <paramref name="location1"/>.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionAnd(ref ulong, Predicate{ulong}, ulong)"/> with the
+        /// bitwise complement of <paramref name="clearBitsValue"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Predicate{T}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (ulong originalValue, ulong newValue) ConditionClearBits (ref ulong location1,
+            Predicate<ulong> condition, ulong clearBitsValue) => ConditionAnd(ref location1, condition, ~clearBitsValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// A thread-safe method to conditionally clear a specific set of bits in a variable
+        /// with the condition based on a function that takes the current value and an argument.
+        /// </summary>
+        /// <typeparam name="T">
+        /// The type of the argument to pass to the condition function.
+        /// </typeparam>
+        /// <param name="location1">
+        /// A variable containing the bits to clear. The result is stored in this variable.
+        /// </param>
+        /// <param name="condition">
+        /// The condition that must be met for the operation to proceed. The delegate takes
+        /// the current value of <paramref name="location1"/> as an argument.
+        /// </param>
+        /// <param name="argument">
+        /// The argument to pass to the condition function <paramref name="condition"/>
+        /// </param>
+        /// <param name="clearBitsValue">
+        /// The value that holds the bits to clear in <paramref name="location1"/>. All the 
+        /// bits set in this value will be cleared in <paramref name="location1"/>.
+        /// </param>
+        /// <returns>
+        /// A tuple containing the original value and the new value after the operation.
+        /// If the condition is not met, the original value is returned in both fields.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// This method is a convenience method that is a semantic alias for 
+        /// <see cref="ConditionAnd{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> with the
+        /// bitwise complement of <paramref name="clearBitsValue"/>
+        /// </para>
+        /// <para>
+        /// This method uses a <see cref="Func{T1, T2, TResult}"/> to determine if the operation 
+        /// should proceed based on the current value of <paramref name="location1"/>. If
+        /// <paramref name="condition"/> returns <see langword="true"/>, then the XOR
+        /// result is stored in <paramref name="location1"/> if the current value is the
+        /// same as the value passed to the condition. If the value has changed in the time
+        /// between being read, and processed by <paramref name="condition"/>, the operation
+        /// is repeated until either the condition is not met, or the operation is successful.
+        /// </para>
+        /// <para>
+        /// This means that if another thread changes the value of <paramref name="location1"/> between
+        /// when it is read, and when the condition is processed, the <paramref name="condition"/>
+        /// could be called multiple times before the operation is successful.
+        /// </para>
+        /// </remarks>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static (ulong originalValue, ulong newValue) ConditionClearBits<T> (ref ulong location1,
+            Func<ulong, T, bool> condition, T argument, ulong clearBitsValue) =>
+            ConditionAnd(ref location1, condition, argument, ~clearBitsValue);
+        //--------------------------------------------------------------------------------
+
+        #endregion Conditional ClearBits
+    }
+    //################################################################################
+}
diff --git a/Source/Src/KZDev.PerfUtils/Internals/EnumExtensions.cs b/Source/Src/KZDev.PerfUtils/Internals/EnumExtensions.cs
index 1b3a2e1..7b18cf9 100644
--- a/Source/Src/KZDev.PerfUtils/Internals/EnumExtensions.cs
+++ b/Source/Src/KZDev.PerfUtils/Internals/EnumExtensions.cs
@@ -1,12 +1,15 @@
 // Copyright (c) Kevin Zehrer
 // Licensed under the MIT License. See LICENSE file in the project root for full license information.
 
+using System.Diagnostics.CodeAnalysis;
+
 namespace KZDev.PerfUtils.Internals
 {
     //################################################################################
     /// <summary>
     /// Extension methods for enums.
     /// </summary>
+    [ExcludeFromCodeCoverage]
     internal static class EnumExtensions
     {
         //--------------------------------------------------------------------------------
diff --git a/Source/Src/KZDev.PerfUtils/KZDev.PerfUtils.csproj b/Source/Src/KZDev.PerfUtils/KZDev.PerfUtils.csproj
index 851dd59..93ae2c2 100644
--- a/Source/Src/KZDev.PerfUtils/KZDev.PerfUtils.csproj
+++ b/Source/Src/KZDev.PerfUtils/KZDev.PerfUtils.csproj
@@ -7,12 +7,12 @@
 	<PropertyGroup Label="Package">
 		<Title>KZDev Performance Utilities</Title>
 		<PackageId>KZDev.PerfUtils</PackageId>
-		<PackageTags>KZDev,Utilities,Performance,MemoryStream,MemoryStreamSlim,Stream,GC,Garbage Collection</PackageTags>
+		<PackageTags>KZDev,Utilities,Performance,Concurrency,Interlocked,Interlocked-Xor,InterlockedOps,GC,Garbage-Collection,MemoryStream,MemoryStreamSlim,Stream</PackageTags>
 		<PackageReadmeFile>docs\README.md</PackageReadmeFile>
 		<PackageIcon>images\icon.png</PackageIcon>
 		<PackageLicenseExpression>MIT</PackageLicenseExpression>
-		<PackageDescription>Performance utilities for .NET projects, initially providing the `MemoryStreamSlim` class; a high-performance, memory-efficient, and easy-to-use replacement for the `MemoryStream` class that provides particular benefits for large or frequently used streams.</PackageDescription>
-		<PackageReleaseNotes>Initial release (version 1.0.0)</PackageReleaseNotes>
+		<PackageDescription>Performance utilities for .NET projects, including the 'MemoryStreamSlim' class; a high-performance, memory-efficient, and easy-to-use replacement for 'MemoryStream', and the 'InterlockedOps' class which has additional thread-safe atomic operations beyond those provided by the 'Interlocked' class.</PackageDescription>
+		<PackageReleaseNotes>Further MemoryStreamSlim performance enhancements and added InterlockedOps class (version 1.1.0).</PackageReleaseNotes>
 		<EmbedUntrackedSources>true</EmbedUntrackedSources>
 		<RepositoryUrl>https://github.com/kzdev-net/kzdev.perfutils</RepositoryUrl>
 	</PropertyGroup>
@@ -29,6 +29,7 @@
 	</PropertyGroup>
 	<ItemGroup Condition="'$(IsPacking)' != 'true'">
 		<InternalsVisibleTo Include="KZDev.PerfUtils.Common.UnitTests" />
+		<InternalsVisibleTo Include="KZDev.PerfUtils.Concurrency.UnitTests" />
 		<InternalsVisibleTo Include="KZDev.PerfUtils.Memory.UnitTests" />
 		<InternalsVisibleTo Include="KZDev.PerfUtils.Memory.Fixed.UnitTests" />
 		<InternalsVisibleTo Include="KZDev.PerfUtils.Memory.Native.UnitTests" />
@@ -39,7 +40,7 @@
 		<InternalsVisibleTo Include="MemoryStreamBenchmarks" />
 	</ItemGroup>
 	<ItemGroup Condition="'$(TargetFramework)' != 'net8.0'">
-	  <PackageReference Include="System.Diagnostics.DiagnosticSource" Version="8.0.1" />
+		<PackageReference Include="System.Diagnostics.DiagnosticSource" Version="$(PerfUtils-Pkg-System_Diagnostics_DiagnosticSource)" />
 	</ItemGroup>
 	<ItemGroup>
 		<Compile Update="Resources\Strings.Designer.cs">
diff --git a/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegment.cs b/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegment.cs
index ab68ff2..6b51d69 100644
--- a/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegment.cs
+++ b/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegment.cs
@@ -136,6 +136,50 @@ public MemorySegment (byte* bufferBlock, int offset, int count)
         }
         //--------------------------------------------------------------------------------
         /// <summary>
+        /// Returns a new memory segment that has a count that is the sum of this segment 
+        /// count and the specified add length.
+        /// </summary>
+        /// <param name="addLength">
+        /// The number of segments to extend the current segment by.
+        /// </param>
+        /// <returns>
+        /// A new memory segment that represents the segment from the same address as this segment
+        /// but with an extended length.
+        /// </returns>
+        public MemorySegment Extend (int addLength) =>
+            IsNative ?
+                // Native memory...
+                // We create a new memory segment that is the combination of the previous buffer
+                // and the new buffer.
+                new MemorySegment(NativePointer, Offset, Count + addLength) :
+                // We create a new memory segment that is the combination of the previous buffer
+                // and the new buffer.
+                new MemorySegment(Array, Offset, Count + addLength);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Merges this memory segment with the specified segment which is assumed to be
+        /// contiguous to this segment.
+        /// </summary>
+        /// <param name="nextSegment">
+        /// The segment to merge with this segment.
+        /// </param>
+        /// <returns>
+        /// A new memory segment that represents the concatenation of this segment and the next segment.
+        /// </returns>
+        public MemorySegment Concat (in MemorySegment nextSegment)
+        {
+            Debug.Assert(nextSegment.Offset == Offset + Count, "The next segment is not contiguous with this segment");
+            return IsNative ?
+                // Native memory...
+                // We create a new memory segment that is the combination of the previous buffer
+                // and the new buffer.
+                new MemorySegment (NativePointer, Offset, Count + nextSegment.Count) :
+                // We create a new memory segment that is the combination of the previous buffer
+                // and the new buffer.
+                new MemorySegment (Array, Offset, Count + nextSegment.Count);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
         /// Gets or sets the byte at the specified index.
         /// </summary>
         /// <param name="index">
diff --git a/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegmentedBufferGroup.cs b/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegmentedBufferGroup.cs
index aa05bc7..e841e5f 100644
--- a/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegmentedBufferGroup.cs
+++ b/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegmentedBufferGroup.cs
@@ -115,7 +115,9 @@ public void Deconstruct (out int segmentIndex, out int segmentCount, out bool ze
         /// Debug helper to display the state of the group.
         /// </summary>
         [ExcludeFromCodeCoverage]
+#pragma warning disable HAA0601
         private string DebugDisplayValue => $"ID {Id}, Count = {_segmentCount}, InUse = {_segmentsInUse}";
+#pragma warning restore HAA0601
 
         /// <summary>
         /// The high bit mask for a ulong.
@@ -135,7 +137,7 @@ public void Deconstruct (out int segmentIndex, out int segmentCount, out bool ze
         /// should be done using the Volatile class, but we want to be explicit about it in the
         /// code, so we don't actually use the volatile keyword here.
         /// </remarks>
-        private static /* volatile */ int _totalGcSegmentsAllocated = 0;
+        private static /* volatile */ int _totalGcSegmentsAllocated;
 
         /// <summary>
         /// The total number of Native Heap segments allocated.
@@ -145,7 +147,7 @@ public void Deconstruct (out int segmentIndex, out int segmentCount, out bool ze
         /// should be done using the Volatile class, but we want to be explicit about it in the
         /// code, so we don't actually use the volatile keyword here.
         /// </remarks>
-        private static /* volatile */ int _totalNativeSegmentsAllocated = 0;
+        private static /* volatile */ int _totalNativeSegmentsAllocated;
 
         /// <summary>
         /// The last ID used for a group.
@@ -313,6 +315,71 @@ private void ReleaseSegments (int segmentIndex, int segmentCount, bool segmentsA
                 Interlocked.Add(ref _segmentsInUse, segmentCount * -1);
         }
 
+        /// <summary>
+        /// Returns information about the series of segments that are all free
+        /// starting at the specified segment index using the flag index and mask.
+        /// </summary>
+        /// <returns>
+        /// The number of contiguous free segments (up to the maximum) and whether all the segments are zeroed.
+        /// </returns>
+        private (int SegmentCount, bool AllZeroed)
+            GetAllFreeSegmentSeriesFromIndex (int firstSegmentIndex, int maxSegments, int flagIndex, ulong flagMask)
+        {
+            Debug.Assert(maxSegments > 1, "maxSegments <= 1");
+            Debug.Assert(firstSegmentIndex >= 0, "firstSegmentIndex < 0");
+
+            // Get a working index for the segment index.
+            int workingSegmentIndex = firstSegmentIndex;
+            // Get the flag set for the segment index.
+            ulong flagGroup = _blockUsedFlags[flagIndex];
+            ulong zeroFlagGroup = _blockZeroFlags[flagIndex];
+            // Get the in use status of this segment.
+            bool segmentIsUsed = (flagGroup & flagMask) != 0;
+            // Track the number of contiguous segments we find.
+            int foundSegmentCount = 0;
+            // Track if all the segments are zeroed.
+            bool allZeroed = true;
+
+            // Looking for a series of free segments
+            while (!segmentIsUsed)
+            {
+                // Check the zero state of the segment.
+                if (allZeroed && ((zeroFlagGroup & flagMask) == 0))
+                    allZeroed = false;
+                // Update the flag group that we are using this segment now.
+                flagGroup |= flagMask;
+                // Increment the number we have
+                if (++foundSegmentCount == maxSegments)
+                    break;
+                // Check the next segment.
+                if (++workingSegmentIndex == _segmentCount)
+                    break;
+                // If we are at the end of the flag group, then move to the next flag group.
+                if (flagMask == HighBitMask)
+                {
+                    // Save the current flag group.
+                    _blockUsedFlags[flagIndex++] = flagGroup;
+                    // The working segment index comparison to the segment count above should
+                    // prevent us from ever going past the end of the flag groups.
+                    Debug.Assert(flagIndex < _blockUsedFlags.Length, "flagIndex >= _blockUsedFlags.Length");
+                    // Get the next flag groups and mask.
+                    flagGroup = _blockUsedFlags[flagIndex];
+                    zeroFlagGroup = _blockZeroFlags[flagIndex];
+                    // Reset the mask
+                    flagMask = 1;
+                }
+                else
+                {
+                    // Otherwise check the next segment.
+                    flagMask <<= 1;
+                }
+                segmentIsUsed = (flagGroup & flagMask) != 0;
+            }
+            // Store the final updates to the used flags.
+            _blockUsedFlags[flagIndex] = flagGroup;
+            return (foundSegmentCount, allZeroed);
+        }
+
         /// <summary>
         /// Returns information about the series of segments that are all used
         /// starting at the specified segment index using the flag index and mask.
@@ -322,8 +389,9 @@ private void ReleaseSegments (int segmentIndex, int segmentCount, bool segmentsA
         /// index and mask to continuously check for the next similar series of segments.
         /// </returns>
         private (int SegmentCount, int NextFlagIndex, ulong NextFlagMask)
-            GetUsedSegmentSeriesFrom (int checkingSegmentIndex, int flagIndex, ulong flagMask)
+            GetUsedSegmentSeriesFromIndex (int checkingSegmentIndex, int flagIndex, ulong flagMask)
         {
+            Debug.Assert(checkingSegmentIndex >= 0, "checkingSegmentIndex < 0");
             // Get the flag set for the segment index.
             ulong flagGroup = _blockUsedFlags[flagIndex];
             // Get the in use status of this segment.
@@ -373,6 +441,7 @@ private void ReleaseSegments (int segmentIndex, int segmentCount, bool segmentsA
         private (int SegmentCount, bool Zeroed, int NextFlagIndex, ulong NextFlagMask)
             GetFreeSegmentSeriesFromIndex (int checkingSegmentIndex, int flagIndex, ulong flagMask)
         {
+            Debug.Assert(checkingSegmentIndex >= 0, "checkingSegmentIndex < 0");
             // Get the flag set for the segment index.
             ulong flagGroup = _blockUsedFlags[flagIndex];
             ulong zeroFlagGroup = _blockZeroFlags[flagIndex];
@@ -425,6 +494,7 @@ private void ReleaseSegments (int segmentIndex, int segmentCount, bool segmentsA
         private (int SegmentCount, bool Used, bool Zeroed, int NextFlagIndex, ulong NextFlagMask)
             GetSimilarStateSegmentSeriesFrom (int startingSegmentIndex, int flagIndex, ulong flagMask)
         {
+            Debug.Assert(startingSegmentIndex >= 0, "startingSegmentIndex < 0");
             // Get the flag set for the segment index.
             ulong flagGroup = _blockUsedFlags[flagIndex];
             // Determine what type of series we're looking for at this segment index.
@@ -432,7 +502,7 @@ private void ReleaseSegments (int segmentIndex, int segmentCount, bool segmentsA
             if (segmentIsUsed)
             {
                 (int usedSegmentCount, int usedNextFlagIndex, ulong usedNextFlagMask) =
-                    GetUsedSegmentSeriesFrom(startingSegmentIndex, flagIndex, flagMask);
+                    GetUsedSegmentSeriesFromIndex(startingSegmentIndex, flagIndex, flagMask);
                 return (usedSegmentCount, true, false, usedNextFlagIndex, usedNextFlagMask);
             }
             (int freeSegmentCount, bool freeZeroed, int freeNextFlagIndex, ulong freeNextFlagMask) =
@@ -535,6 +605,7 @@ private UnusedSegmentRange GetClosestUnusedSegmentSeries (int requestedSegments)
                     _blockUsedFlags[flagIndex] = flagGroup;
                     // This check MUST happen before the increment of the flagIndex.
                     if (markSegmentIndex == segmentCount)
+                        // Break out of the loop early so that we don't increment the flagIndex.
                         break;
                     // Reset the mask
                     flagMask = 1;
@@ -553,6 +624,42 @@ private UnusedSegmentRange GetClosestUnusedSegmentSeries (int requestedSegments)
             return (startingSegmentIndex, segmentCount, zeroed);
         }
 
+        /// <summary>
+        /// Tries to reserve a set of segments for use starting at a specific index and returns whether
+        /// the segments were reserved, the number of segments reserved, and if the segments are zeroed.
+        /// </summary>
+        /// <returns>
+        /// Values indicating the segment reserved, which includes the first segment index,
+        /// the number of contiguous segments reserved, and if the segment is zeroed. 
+        /// </returns>
+        private (int SegmentCount, bool Zeroed) TryReserveSegments (int requestedSegments,
+            int firstSegmentIndex)
+        {
+            Debug.Assert(requestedSegments > 1, "requestedSegments <= 1");
+            Debug.Assert(firstSegmentIndex > 0, "firstSegmentIndex <= 0");
+            // Check if we can even use this segment.
+            if (firstSegmentIndex >= _segmentCount)
+                return (0, false);
+            // Get the index of the flag set and the mask for the segment index.
+            (int flagIndex, ulong flagMask) = GetFlagIndexAndMask(firstSegmentIndex);
+            // Get the flag set for the segment index.
+            ulong flagGroup = _blockUsedFlags[flagIndex];
+            // Check if the segment is in use.
+            if ((flagGroup & flagMask) != 0)
+            {
+                // The first segment is in use.
+                return (0, false);
+            }
+
+            // Find a series of segments that are unused and treat that series as zeroed ONLY if all the
+            // segments in the series are zeroed.
+            (int segmentCount, bool zeroed) =
+                GetAllFreeSegmentSeriesFromIndex(firstSegmentIndex, requestedSegments, flagIndex, flagMask);
+            // Update the number of segments in use.
+            Interlocked.Add(ref _segmentsInUse, segmentCount);
+            return (segmentCount, zeroed);
+        }
+
         /// <summary>
         /// Reserves a segment index for use and returns the segment index that was reserved.
         /// and if the segment is zeroed.
@@ -563,8 +670,8 @@ private UnusedSegmentRange GetClosestUnusedSegmentSeries (int requestedSegments)
         /// </returns>
         private (int SegmentIndex, bool Zeroed) ReserveSegment ()
         {
-            // For single segments, try from the last segment backwards....
-            int checkSegmentIndex = _segmentCount - 1;
+            // Move forward from the start of the block to find the first unused segment.
+            int checkSegmentIndex = 0;
             // Get the index of the flag set and the mask for the segment index.
             (int flagIndex, ulong flagMask) = GetFlagIndexAndMask(checkSegmentIndex);
             // Get the flag set for the segment index.
@@ -581,17 +688,59 @@ private UnusedSegmentRange GetClosestUnusedSegmentSeries (int requestedSegments)
                     return (checkSegmentIndex, (_blockZeroFlags[flagIndex] & flagMask) != 0);
                 }
                 // Check the next segment.
-                checkSegmentIndex--;
-                Debug.Assert(checkSegmentIndex >= 0, "checkSegmentIndex < 0");
-                if (flagMask == 1)
+                checkSegmentIndex++;
+                Debug.Assert(checkSegmentIndex < _segmentCount, "checkSegmentIndex >= _segmentCount");
+                // If we are at the end of the flag group, then move to the next flag group.
+                if (flagMask == HighBitMask)
                 {
-                    Debug.Assert(flagIndex > 0, "flagIndex <= 0");
-                    flagMask = HighBitMask;
-                    flagGroup = _blockUsedFlags[--flagIndex];
+                    if (++flagIndex == _blockUsedFlags.Length)
+                        break;
+                    // Get the next flag group and mask.
+                    flagGroup = _blockUsedFlags[flagIndex];
+                    flagMask = 1;
                     continue;
                 }
-                flagMask >>= 1;
+                // Otherwise move to the next segment
+                flagMask <<= 1;
             }
+            // We should never get here because we should always have a single free segment if 
+            // this is called, because the full state should have already been checked.
+            Debug.Fail("No free segments found.");
+            return (-1, false);
+        }
+
+        /// <summary>
+        /// Tries to reserve a specific segment index for use and returns whether that segment index was reserved.
+        /// and if the segment is zeroed.
+        /// </summary>
+        /// <param name="segmentIndex">
+        /// The specific segment index to try and reserve.
+        /// </param>
+        /// <returns>
+        /// Values indicating the segment reserved, and if the segment is zeroed.
+        /// </returns>
+        private (bool SegmentReserved, bool Zeroed) TryReserveSegment (int segmentIndex)
+        {
+            Debug.Assert(segmentIndex > 0, "segmentIndex <= 0");
+            // Check if we can even use this segment.
+            if (segmentIndex >= _segmentCount)
+                return (false, false);
+            // Get the index of the flag set and the mask for the segment index.
+            (int flagIndex, ulong flagMask) = GetFlagIndexAndMask(segmentIndex);
+            // Get the flag set for the segment index.
+            ulong flagGroup = _blockUsedFlags[flagIndex];
+            // Check if the segment is in use.
+            if ((flagGroup & flagMask) != 0)
+            {
+                // The segment is in use.
+                return (false, false);
+            }
+
+            // Mark the segment as in use.
+            _blockUsedFlags[flagIndex] = flagGroup | flagMask;
+            Interlocked.Increment(ref _segmentsInUse);
+            // Return the index and the zeroed state of the segment.
+            return (true, (_blockZeroFlags[flagIndex] & flagMask) != 0);
         }
 
         /// <summary>
@@ -645,10 +794,12 @@ private bool AllocateNativeBufferIfNeeded ()
         static MemorySegmentedBufferGroup ()
         {
             // Create the observable gauges for the total allocated memory.
+#pragma warning disable HAA0601
             MemoryMeter.Meter.CreateObservableGauge("segment_memory.gc_allocated", static () => Volatile.Read(ref _totalGcSegmentsAllocated),
                 unit: "{segments}", description: $"The total number of GC heap segments (of {StandardBufferSegmentSize:N0} bytes) allocated for the segmented memory buffers");
             MemoryMeter.Meter.CreateObservableGauge("segment_memory.native_allocated", static () => Volatile.Read(ref _totalNativeSegmentsAllocated),
                 unit: "{segments}", description: $"The total number of native heap segments (of {StandardBufferSegmentSize:N0} bytes) allocated for the segmented memory buffers");
+#pragma warning restore HAA0601
         }
 
         /// <summary>
@@ -745,43 +896,84 @@ public void ReleaseBuffer (in SegmentBuffer buffer, bool segmentIsZeroed)
         /// <param name="bufferPool">
         /// The buffer pool that is requesting the buffer.
         /// </param>
+        /// <param name="preferredFirstSegmentIndex">
+        /// The index of the first segment to try and allocate from. If this is -1, then we will
+        /// not try to allocate from a specific segment.
+        /// </param>
         /// <returns>
         /// The buffer to use from this group if available, and a result value for the operation.
         /// </returns>
-        public (SegmentBuffer buffer, GetBufferResult result) GetBuffer (int bufferSize, bool requireZeroed, MemorySegmentedBufferPool bufferPool)
+        public (SegmentBuffer Buffer, GetBufferResult Result, bool SegmentIsPreferred)
+            GetBuffer (int bufferSize, bool requireZeroed, MemorySegmentedBufferPool bufferPool, int preferredFirstSegmentIndex)
         {
             Debug.Assert(0 == (bufferSize % StandardBufferSegmentSize), "bufferSize is not an even multiple of StandardBufferSegmentSize");
             int segmentsNeeded = bufferSize / StandardBufferSegmentSize;
-            int reservedSegmentIndex;
-            int reservedSegmentCount;
-            bool segmentsZeroed;
+            // The index of the first segment we have reserved. This will be
+            // -1 if we don't have a segment reserved yet.
+            int reservedSegmentIndex = -1;
+            // The number of segments we have reserved.
+            int reservedSegmentCount = 0;
+            // Indicates if the segments we have are zeroed.
+            bool segmentsZeroed = false;
+            // Flag that indicates the segment we have is the preferred segment.
+            bool segmentIsPreferred = false;
 
             if (Interlocked.CompareExchange(ref _locked, 1, 0) == 1)
-                return (SegmentBuffer.Empty, GetBufferResult.GroupLocked);
+                return (SegmentBuffer.Empty, GetBufferResult.GroupLocked, false);
             try
             {
                 // We allocate the block when needed. It is not ideal that we are doing an allocation while holding the lock, but
                 // we hope that with it being uninitialized, it will be fast enough, plus the return code of any race condition callers
                 // will allow them to handle the lock externally. If we didn't hold the lock and just did the allocation, then we could
-                // possibly allocate a buffer segment and then immediately release it, which is very likely even worse.
+                // possibly allocate a buffer segment and then immediately release it, which is very likely even a worse condition.
                 if ((!AllocateBufferIfNeeded()) && IsFull)
-                    return (SegmentBuffer.Empty, GetBufferResult.GroupFull);
+                    return (SegmentBuffer.Empty, GetBufferResult.GroupFull, false);
 
                 // Reserve the segments
                 if (segmentsNeeded == 1)
                 {
-                    (reservedSegmentIndex, segmentsZeroed) = ReserveSegment();
+                    // Try to get the preferred segment first.
+                    if (preferredFirstSegmentIndex >=0) 
+                    {
+                        (segmentIsPreferred, segmentsZeroed) = TryReserveSegment(preferredFirstSegmentIndex);
+                        if (segmentIsPreferred)
+                            reservedSegmentIndex = preferredFirstSegmentIndex;
+                    }
+                    // If we didn't get the preferred segment, then try to get any segment.
+                    if (reservedSegmentIndex < 0)
+                    {
+                        (reservedSegmentIndex, segmentsZeroed) = ReserveSegment();
+                    }
                     reservedSegmentCount = 1;
                 }
                 else
                 {
-                    (reservedSegmentIndex, reservedSegmentCount, segmentsZeroed) = ReserveSegments(segmentsNeeded);
+                    // We need multiple segments
+                    // Try to get the series at the preferred segment first.
+                    if (preferredFirstSegmentIndex >=0)
+                    {
+                        (reservedSegmentCount, segmentsZeroed) = TryReserveSegments(segmentsNeeded, preferredFirstSegmentIndex);
+                        if (reservedSegmentCount > 0)
+                        {
+                            // We got the preferred segment, so we know that the first
+                            // segment index is the preferred segment.
+                            reservedSegmentIndex = preferredFirstSegmentIndex;
+                            segmentIsPreferred = true;
+                        }
+                    }
+                    // If we didn't get segments from the preferred segment, then try to get any series of segments.
+                    if (reservedSegmentIndex < 0)
+                    {
+                        (reservedSegmentIndex, reservedSegmentCount, segmentsZeroed) = ReserveSegments(segmentsNeeded);
+                    }
                 }
             }
             finally
             {
                 Volatile.Write(ref _locked, 0);
             }
+            Debug.Assert(reservedSegmentIndex >= 0, "reservedSegmentIndex < 0");
+            Debug.Assert(reservedSegmentCount > 0, "reservedSegmentCount <= 0");
             // Track where the buffer is from, so we can release it later.
             SegmentBufferInfo bufferInfo = new(Id, reservedSegmentIndex, reservedSegmentCount, bufferPool);
             if (_useNativeMemory)
@@ -792,7 +984,7 @@ public void ReleaseBuffer (in SegmentBuffer buffer, bool segmentIsZeroed)
                 {
                     memorySegment.Clear();
                 }
-                return (new SegmentBuffer(memorySegment, bufferInfo), GetBufferResult.Available);
+                return (new SegmentBuffer(memorySegment, bufferInfo), GetBufferResult.Available, segmentIsPreferred);
             }
             MemorySegment arraySegment = new(_bufferBlock!, (reservedSegmentIndex * StandardBufferSegmentSize),
                 reservedSegmentCount * StandardBufferSegmentSize);
@@ -800,7 +992,30 @@ public void ReleaseBuffer (in SegmentBuffer buffer, bool segmentIsZeroed)
             {
                 arraySegment.Clear();
             }
-            return (new SegmentBuffer(arraySegment, bufferInfo), GetBufferResult.Available);
+            return (new SegmentBuffer(arraySegment, bufferInfo), GetBufferResult.Available, segmentIsPreferred);
+        }
+
+        /// <summary>
+        /// Attempts to get a buffer from the group.
+        /// </summary>
+        /// <param name="bufferSize">
+        /// The size of the buffer that we need.
+        /// </param>
+        /// <param name="requireZeroed">
+        /// Indicates if we need to force the buffer to be zeroed.
+        /// </param>
+        /// <param name="bufferPool">
+        /// The buffer pool that is requesting the buffer.
+        /// </param>
+        /// <returns>
+        /// The buffer to use from this group if available, and a result value for the operation.
+        /// </returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public (SegmentBuffer Buffer, GetBufferResult Result)
+            GetBuffer (int bufferSize, bool requireZeroed, MemorySegmentedBufferPool bufferPool)
+        {
+            (SegmentBuffer buffer, GetBufferResult result, bool _) = GetBuffer(bufferSize, requireZeroed, bufferPool, -1);
+            return (buffer, result);
         }
 
         /// <summary>
diff --git a/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegmentedBufferPool.cs b/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegmentedBufferPool.cs
index 659e8dd..0def8ab 100644
--- a/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegmentedBufferPool.cs
+++ b/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegmentedBufferPool.cs
@@ -4,6 +4,7 @@
 using System.Collections.Concurrent;
 using System.Diagnostics;
 using System.Diagnostics.CodeAnalysis;
+using System.Runtime.CompilerServices;
 
 namespace KZDev.PerfUtils.Internals
 {
@@ -33,7 +34,9 @@ internal class MemorySegmentedBufferPool
         /// Debug helper to display the state of the pool.
         /// </summary>
         [ExcludeFromCodeCoverage]
+#pragma warning disable HAA0601
         private string DebugDisplayValue => $"Native Memory = {_useNativeMemory}, Zero Pending = {_pendingZeroList.Count}, Group = {_arrayGroup.DebugDisplayValue}";
+#pragma warning restore HAA0601
 
         /// <summary>
         /// A flag indicating if we should use native memory for the buffers.
@@ -97,18 +100,22 @@ private static void DoZeroProcessing (MemorySegmentedBufferPool poolInstance)
                     // Now, loop through the pending list and zero out the buffers.
                     for (int loopIndex = 0; loopIndex < runLoops; loopIndex++)
                     {
-                        if (!pendingZeroList.TryTake(out SegmentBuffer buffer))
+                        if (!pendingZeroList.TryTake(out SegmentBuffer releaseBuffer))
                             break;
-                        buffer.Clear();
+                        releaseBuffer.Clear();
                         // Store the buffer back in the group.
-                        if (!generationArray.ReleaseBuffer(buffer, true))
+                        if (!generationArray.ReleaseBuffer(releaseBuffer, true))
                         {
                             // If we get here, this means that the buffer actually came from a generation that is newer
                             // than the one we grabbed a reference to. So, the buffer group was not found.
                             // We could try to get the most recent generation and just loop again,
                             // but we might just as well break out and let the next round just pick
                             // up from the beginning, since could possibly indicate things are pretty busy.
-                            moreWork = true;
+                            // We are going to take a bit of a performance hit here because we will zero the buffer more
+                            // than once, but we need to make sure this segment gets properly released, and we need to
+                            // put it back into the pending zero list to be zeroed out again on the next pass.
+                            // This is the safest this to do, and this condition will be extremely rare.
+                            pendingZeroList.Add(releaseBuffer);
                             break;
                         }
 
@@ -119,12 +126,12 @@ private static void DoZeroProcessing (MemorySegmentedBufferPool poolInstance)
                         // We have been running for too long, so we should stop and return the thread to the pool.
 
 #if FALSE
-                    // Check if we should dedicate a thread to this operation.
-                    if (pendingZeroList.Count > startPendingCount)
-                    {
-                        // We are falling behind, so we should consider dedicating a thread to this operation.
-                        // TODO: Consider dedicating a thread to this operation.
-                    }
+                        // Check if we should dedicate a thread to this operation.
+                        if (pendingZeroList.Count > startPendingCount)
+                        {
+                            // We are falling behind, so we should consider dedicating a thread to this operation.
+                            // TODO: Consider dedicating a thread to this operation.
+                        }
 #endif
                         break;
                     }
@@ -204,7 +211,7 @@ private MemorySegmentedGroupGenerationArray ExpandArrayGroup (MemorySegmentedGro
         /// </summary>
         private void TriggerZeroProcessing ()
         {
-            if (Interlocked.CompareExchange (ref _zeroProcessingActive, 1, 0) != 0) return;
+            if (Interlocked.CompareExchange(ref _zeroProcessingActive, 1, 0) != 0) return;
             try
             {
 #if CONCURRENCY_TESTING   // Concurrency testing does not currently support async/await and/or ThreadPool.QueueUserWorkItem
@@ -229,15 +236,71 @@ private void TriggerZeroProcessing ()
         /// <param name="clearNewAllocations">
         /// Indicates whether we need new allocations to be cleared.
         /// </param>
+        /// <param name="requestedSegmentCount">
+        /// The number of segments that are being requested.
+        /// </param>
+        /// <param name="generationArray">
+        /// The generation array that we are renting from.
+        /// </param>
+        /// <param name="preferredBlockInfo">
+        /// Information about the last block that was used to allocate a buffer. This is used
+        /// to try and allocate from the same block and next segment if possible
+        /// </param>
+        /// <returns>
+        /// A buffer that is the size of the buffer size for this pool and a flag indicating 
+        /// if the returned buffer is the next segment from the preferred block.
+        /// </returns>
+        private (SegmentBuffer Buffer, bool IsNextBlockSegment) 
+            RentFromGeneration (int requestedBufferSize, int requestedSegmentCount,
+            MemorySegmentedGroupGenerationArray generationArray, bool clearNewAllocations, 
+            in SegmentBufferInfo preferredBlockInfo)
+        {
+            // Try to rent from the preferred group first.
+            MemorySegmentedBufferGroup[] segmentGroupArray = generationArray.Groups;
+            MemorySegmentedBufferGroup? preferredGroup = null;
+            for (int groupIndex = 0; groupIndex < segmentGroupArray.Length; groupIndex++)
+            {
+                MemorySegmentedBufferGroup group = segmentGroupArray[groupIndex];
+                if (group.Id != preferredBlockInfo.BlockId)
+                    continue;
+                preferredGroup = group;
+                break;
+            }
+            // If we can't find that group for some reason, then just rent without the preferred block info.
+            if (preferredGroup is null)
+                return (RentFromGeneration(requestedBufferSize, requestedSegmentCount, generationArray, clearNewAllocations), false);
+
+            // Try to get the buffer from the preferred group.
+            (SegmentBuffer buffer, GetBufferResult getResult, bool segmentIsPreferredInBlock) =
+                preferredGroup.GetBuffer(requestedBufferSize, clearNewAllocations, this, preferredBlockInfo.SegmentId + preferredBlockInfo.SegmentCount);
+            return (getResult == GetBufferResult.Available) ? (buffer, segmentIsPreferredInBlock) :
+                // The group is either locked or the preferred segment was not available, so we will fall
+                // back to the normal rent operation.
+                (RentFromGeneration(requestedBufferSize, requestedSegmentCount, generationArray, clearNewAllocations), false);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Helper to do the actual rent operation.
+        /// </summary>
+        /// <param name="requestedBufferSize">
+        /// The desired size of the buffer to rent.
+        /// </param>
+        /// <param name="clearNewAllocations">
+        /// Indicates whether we need new allocations to be cleared.
+        /// </param>
+        /// <param name="requestedSegmentCount">
+        /// The number of segments that are being requested.
+        /// </param>
+        /// <param name="generationArray">
+        /// The generation array that we are renting from.
+        /// </param>
         /// <returns>
         /// A buffer that is the size of the buffer size for this pool.
         /// </returns>
-        private SegmentBuffer RentInternal (int requestedBufferSize, bool clearNewAllocations)
+        private SegmentBuffer RentFromGeneration (int requestedBufferSize, int requestedSegmentCount,
+            MemorySegmentedGroupGenerationArray generationArray, bool clearNewAllocations)
         {
             int lockedLoops = 0;
-            int requestedSegmentCount = requestedBufferSize / MemorySegmentedBufferGroup.StandardBufferSegmentSize;
-            // Volatile read of the array group generation to get our local reference.
-            MemorySegmentedGroupGenerationArray generationArray = Volatile.Read(ref _arrayGroup);
             // For larger segment counts, we will look backwards in the group array since the latter groups are likely larger.
             bool lookBackwards = requestedSegmentCount >= (generationArray.MaxGroupSegmentCount / 2);
 
@@ -314,6 +377,46 @@ private SegmentBuffer RentInternal (int requestedBufferSize, bool clearNewAlloca
         }
         //--------------------------------------------------------------------------------
         /// <summary>
+        /// Helper to do the actual rent operation.
+        /// </summary>
+        /// <param name="requestedBufferSize">
+        /// The desired size of the buffer to rent.
+        /// </param>
+        /// <param name="clearNewAllocations">
+        /// Indicates whether we need new allocations to be cleared.
+        /// </param>
+        /// <returns>
+        /// A buffer that is the size of the buffer size for this pool.
+        /// </returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        private SegmentBuffer RentInternal (int requestedBufferSize, bool clearNewAllocations) =>
+            RentFromGeneration(requestedBufferSize, requestedBufferSize / MemorySegmentedBufferGroup.StandardBufferSegmentSize,
+                Volatile.Read(ref _arrayGroup), clearNewAllocations);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Helper to do the actual rent operation.
+        /// </summary>
+        /// <param name="requestedBufferSize">
+        /// The desired size of the buffer to rent.
+        /// </param>
+        /// <param name="clearNewAllocations">
+        /// Indicates whether we need new allocations to be cleared.
+        /// </param>
+        /// <param name="preferredBlockInfo">
+        /// Information about the last block that was used to allocate a buffer. This is used
+        /// to try and allocate from the same block and next segment if possible
+        /// </param>
+        /// <returns>
+        /// A buffer that is the size of the buffer size for this pool and a flag indicating 
+        /// if the returned buffer is the next segment from the preferred block.
+        /// </returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        private (SegmentBuffer Buffer, bool IsNextBlockSegment) RentInternal (int requestedBufferSize, 
+            bool clearNewAllocations, in SegmentBufferInfo preferredBlockInfo) =>
+            RentFromGeneration(requestedBufferSize, requestedBufferSize / MemorySegmentedBufferGroup.StandardBufferSegmentSize,
+                Volatile.Read(ref _arrayGroup), clearNewAllocations, preferredBlockInfo);
+        //--------------------------------------------------------------------------------
+        /// <summary>
         /// Initializes a new instance of the <see cref="MemorySegmentedBufferPool"/> class.
         /// </summary>
         /// <param name="useNativeMemory">
@@ -337,8 +440,39 @@ public MemorySegmentedBufferPool (bool useNativeMemory)
         /// <returns>
         /// A buffer that is the size of the buffer size for this pool.
         /// </returns>
-        public SegmentBuffer Rent (int requestedBufferSize, bool clearNewAllocations) =>
-            RentInternal(requestedBufferSize, clearNewAllocations);
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public SegmentBuffer Rent (int requestedBufferSize, bool clearNewAllocations)
+        {
+            Debug.Assert(requestedBufferSize > 0, "requestedBufferSize <= 0");
+            Debug.Assert(0 == (requestedBufferSize % MemorySegmentedBufferGroup.StandardBufferSegmentSize), "requestedBufferSize is not a multiple of the segment size");
+            return RentInternal (requestedBufferSize, clearNewAllocations);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Returns a buffer that is the size of the buffer size for this pool.
+        /// </summary>
+        /// <param name="requestedBufferSize">
+        /// The desired size of the buffer to rent.
+        /// </param>
+        /// <param name="clearNewAllocations">
+        /// Indicates whether we need new allocations to be cleared.
+        /// </param>
+        /// <param name="preferredBlockInfo">
+        /// Information about the last block that was used to allocate a buffer. This is used
+        /// to try and allocate from the same block and next segment if possible
+        /// </param>
+        /// <returns>
+        /// A buffer that is the size of the buffer size for this pool and a flag indicating 
+        /// if the returned buffer is the next segment from the preferred block.
+        /// </returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public (SegmentBuffer Buffer, bool IsNextBlockSegment) RentFromPreferredBlock 
+            (int requestedBufferSize, bool clearNewAllocations, in SegmentBufferInfo preferredBlockInfo)
+        {
+            Debug.Assert(requestedBufferSize > 0, "requestedBufferSize <= 0");
+            Debug.Assert(0 == (requestedBufferSize % MemorySegmentedBufferGroup.StandardBufferSegmentSize), "requestedBufferSize is not a multiple of the segment size");
+            return RentInternal (requestedBufferSize, clearNewAllocations, preferredBlockInfo);
+        }
         //--------------------------------------------------------------------------------
         /// <summary>
         /// Returns a buffer to the pool.
diff --git a/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegmentedGroupGenerationArray.cs b/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegmentedGroupGenerationArray.cs
index 0c0487d..73e8ca0 100644
--- a/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegmentedGroupGenerationArray.cs
+++ b/Source/Src/KZDev.PerfUtils/Memory/Internals/MemorySegmentedGroupGenerationArray.cs
@@ -118,7 +118,9 @@ private MemorySegmentedGroupGenerationArray (bool useNativeMemory)
         }
 
         /// <summary>
-        /// Initializes a new instance of the <see cref="MemorySegmentedGroupGenerationArray"/> class.
+        /// Initializes a new instance of the <see cref="MemorySegmentedGroupGenerationArray"/> class. This is the
+        /// constructor used to create a new generation array from an existing array - to basically
+        /// expand the arrays available.
         /// </summary>
         /// <param name="sourceArray">
         /// The source array to copy existing groups from.
@@ -144,8 +146,9 @@ public MemorySegmentedGroupGenerationArray (MemorySegmentedGroupGenerationArray
             Array.Copy(sourceArray.Groups, Groups, sourceArray.Groups.Length);
             // Create a new group for the last group. We will double the segment count of the last group
             // to a point, then we will simply add 32 segments to the last group size.
-            int nextGroupShiftSegmentCount = sourceArray.Groups[^1].SegmentCount << 1;
-            int nextGroupLinearSegmentCount = sourceArray.Groups[^1].SegmentCount + 32;
+            int lastGroupSegmentCount = sourceArray.Groups[^1].SegmentCount;
+            int nextGroupShiftSegmentCount = lastGroupSegmentCount << 1;
+            int nextGroupLinearSegmentCount = lastGroupSegmentCount + 32;
             int nextGroupSegmentCount = Math.Min(MaxAllowedGroupSegmentCount, Math.Min(nextGroupLinearSegmentCount, nextGroupShiftSegmentCount));
             Groups[sourceArray.Groups.Length] = new MemorySegmentedBufferGroup(MaxGroupSegmentCount = nextGroupSegmentCount, useNativeMemory);
         }
diff --git a/Source/Src/KZDev.PerfUtils/Memory/Internals/NativeMemoryManager.cs b/Source/Src/KZDev.PerfUtils/Memory/Internals/NativeMemoryManager.cs
index f6fafae..5dfc9c9 100644
--- a/Source/Src/KZDev.PerfUtils/Memory/Internals/NativeMemoryManager.cs
+++ b/Source/Src/KZDev.PerfUtils/Memory/Internals/NativeMemoryManager.cs
@@ -2,6 +2,7 @@
 // Licensed under the MIT License. See LICENSE file in the project root for full license information.
 
 using System.Buffers;
+using System.Diagnostics.CodeAnalysis;
 
 namespace KZDev.PerfUtils.Internals
 {
@@ -51,6 +52,7 @@ private NativeMemoryManager (byte* pointer, int length)
         public override Span<byte> GetSpan () => new(_pointer, _length);
         //--------------------------------------------------------------------------------
         /// <inheritdoc />
+        [ExcludeFromCodeCoverage]
         public override MemoryHandle Pin (int elementIndex = 0)
         {
             if (elementIndex < 0 || elementIndex >= _length)
@@ -60,12 +62,14 @@ public override MemoryHandle Pin (int elementIndex = 0)
         }
         //--------------------------------------------------------------------------------
         /// <inheritdoc />
+        [ExcludeFromCodeCoverage]
         public override void Unpin ()
         {
             // No action required. We didn't actually pin the memory - it is native memory.
         }
         //--------------------------------------------------------------------------------
         /// <inheritdoc />
+        [ExcludeFromCodeCoverage]
         protected override void Dispose (bool disposing)
         {
             // No managed resources to release - the native memory freeing is handled elsewhere.
diff --git a/Source/Src/KZDev.PerfUtils/Memory/Internals/SegmentBuffer.cs b/Source/Src/KZDev.PerfUtils/Memory/Internals/SegmentBuffer.cs
index 97c87e2..a691548 100644
--- a/Source/Src/KZDev.PerfUtils/Memory/Internals/SegmentBuffer.cs
+++ b/Source/Src/KZDev.PerfUtils/Memory/Internals/SegmentBuffer.cs
@@ -19,7 +19,9 @@ internal readonly struct SegmentBuffer
         /// Debug helper to display the state of this object.
         /// </summary>
         [ExcludeFromCodeCoverage]
+#pragma warning disable HAA0601
         internal string DebugDisplayValue => IsEmpty && (BufferInfo.BlockId < 0) ? "Empty" : $"{BufferInfo.DebugDisplayValue}, Length {Length}, {(IsRaw ? "Raw" : "NotRaw")}, Segment: {MemorySegment.DebugDisplayValue}";
+#pragma warning restore HAA0601
 
         /// <summary>
         /// The raw buffer that this segment references, if any.
@@ -136,24 +138,24 @@ public SegmentBuffer (in MemorySegment memorySegment, in SegmentBufferInfo buffe
         }
         //--------------------------------------------------------------------------------
         /// <summary>
-        /// Initializes a new instance of the <see cref="SegmentBuffer"/> struct with a 
-        /// raw byte buffer.
+        /// Merges this segment with another segment which is assumed to follow this segment
+        /// in the internal allocated buffer.
         /// </summary>
-        /// <param name="buffer">
-        /// The raw byte buffer.
+        /// <param name="nextBuffer">
+        /// The next segment to merge with this segment.
         /// </param>
-        /// <param name="bufferInfo">
-        /// The meta-data information about this buffer segment.
-        /// </param>
-        public SegmentBuffer (byte[] buffer, in SegmentBufferInfo bufferInfo)
+        /// <returns>
+        /// A new <see cref="SegmentBuffer"/> instance that represents the merged segments.
+        /// </returns>
+        public SegmentBuffer Concat (in SegmentBuffer nextBuffer)
         {
-            Debug.Assert(buffer is not null, "buffer is not null");
-            Debug.Assert(buffer.Length > 0, "buffer.Length <= 0");
-            Debug.Assert(bufferInfo.SegmentCount > 0, "bufferInfo.SegmentCount <= 0");
+            Debug.Assert(!IsRaw, "IsRaw");
+            Debug.Assert(!nextBuffer.IsRaw, "other.IsRaw");
+            Debug.Assert(BufferInfo.SegmentId + BufferInfo.SegmentCount == nextBuffer.BufferInfo.SegmentId, "next buffer doesn't follow this buffer in the allocated memory");
+            Debug.Assert(BufferInfo.BlockId == nextBuffer.BufferInfo.BlockId, "next buffer is from a different block");
 
-            RawBuffer = buffer;
-            MemorySegment = new MemorySegment(buffer);
-            BufferInfo = bufferInfo;
+            // Get the new memory segment that is the combination of the two segments and create the new segment buffer
+            return new SegmentBuffer(MemorySegment.Extend(nextBuffer.Length), BufferInfo.Concat(nextBuffer.BufferInfo));
         }
         //--------------------------------------------------------------------------------
         /// <summary>
diff --git a/Source/Src/KZDev.PerfUtils/Memory/Internals/SegmentBufferInfo.cs b/Source/Src/KZDev.PerfUtils/Memory/Internals/SegmentBufferInfo.cs
index 70859e0..804cfbf 100644
--- a/Source/Src/KZDev.PerfUtils/Memory/Internals/SegmentBufferInfo.cs
+++ b/Source/Src/KZDev.PerfUtils/Memory/Internals/SegmentBufferInfo.cs
@@ -36,6 +36,23 @@ internal readonly struct SegmentBufferInfo(int blockId, int segmentId, int segme
         /// </summary>
         public static SegmentBufferInfo NoBlock { [DebuggerStepThrough] get; } = new(-1, -1, 0, null);
 
+        /// <summary>
+        /// Helper to create a new segment buffer info from this segment buffer info and the new segment buffer
+        /// info which is assumed to represent the next segment buffer in contiguous memory.
+        /// </summary>
+        /// <param name="other"></param>
+        /// <returns></returns>
+        public SegmentBufferInfo Concat(in SegmentBufferInfo other)
+        {
+            Debug.Assert(BlockId == other.BlockId, "BlockId must be the same for both segment buffer infos to concatenate.");
+            Debug.Assert(SegmentCount >= 0, "SegmentCount must be greater than or equal to 0.");
+            Debug.Assert(other.SegmentCount >= 0, "SegmentCount of the other segment buffer info must be greater than or equal to 0.");
+            Debug.Assert(SegmentId + SegmentCount == other.SegmentId, "The segment id of the other segment buffer info must be the next segment id in the block.");
+            Debug.Assert(BufferPool == other.BufferPool, "BufferPool must be the same for both segment buffer infos to concatenate.");
+
+            return new SegmentBufferInfo(BlockId, SegmentId, SegmentCount + other.SegmentCount, BufferPool);
+        }
+
         /// <summary>
         /// Identifies the block that this segment references.
         /// </summary>
diff --git a/Source/Src/KZDev.PerfUtils/Memory/Internals/SegmentBufferWithOffset.cs b/Source/Src/KZDev.PerfUtils/Memory/Internals/SegmentBufferWithOffset.cs
index 2f34ad3..365015e 100644
--- a/Source/Src/KZDev.PerfUtils/Memory/Internals/SegmentBufferWithOffset.cs
+++ b/Source/Src/KZDev.PerfUtils/Memory/Internals/SegmentBufferWithOffset.cs
@@ -2,6 +2,7 @@
 // Licensed under the MIT License. See LICENSE file in the project root for full license information.
 
 using System.Diagnostics;
+using System.Runtime.CompilerServices;
 
 namespace KZDev.PerfUtils.Internals
 {
@@ -10,9 +11,34 @@ namespace KZDev.PerfUtils.Internals
     /// A pairing of a <see cref="SegmentBuffer"/> with virtual stream space metadata 
     /// about the end of the stream space where the segment buffer is located.
     /// </summary>
+    /// <param name="segmentBuffer">
+    /// The segment buffer information that describes this segment.
+    /// </param>
+    /// <param name="segmentEndCount">
+    /// The virtual end position of this segment in the segment list.
+    /// </param>
+    /// <param name="segmentEndOffset">
+    /// The number of total standard segments through this segment in the segment list.
+    /// </param>
     [DebuggerDisplay($"{{{nameof(DebugDisplayValue)}}}")]
     internal readonly struct SegmentBufferVirtualInfo (in SegmentBuffer segmentBuffer, long segmentEndOffset, int segmentEndCount)
     {
+        /// <summary>
+        /// Helper to create a new segment buffer virtual info from the previous segment buffer virtual info and the new segment buffer.
+        /// </summary>
+        /// <param name="segmentBuffer">
+        /// The segment buffer to create the virtual info for.
+        /// </param>
+        /// <param name="previous">
+        /// The previous segment buffer virtual info that we will use to derive the new segment buffer virtual info.
+        /// </param>
+        /// <returns>
+        /// The new segment buffer virtual info that should follow the previous segment buffer virtual info.
+        /// </returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static SegmentBufferVirtualInfo FromPrevious (in SegmentBuffer segmentBuffer, in SegmentBufferVirtualInfo previous) => 
+            new(segmentBuffer, segmentBuffer.Length + previous.SegmentEndOffset, segmentBuffer.SegmentCount + previous.SegmentEndCount);
+
         /// <summary>
         /// Debug helper to display the state of the group.
         /// </summary>
diff --git a/Source/Src/KZDev.PerfUtils/MemoryStream/Internals/SegmentMemoryStreamSlim.cs b/Source/Src/KZDev.PerfUtils/MemoryStream/Internals/SegmentMemoryStreamSlim.cs
index 4c4fc57..d868f6e 100644
--- a/Source/Src/KZDev.PerfUtils/MemoryStream/Internals/SegmentMemoryStreamSlim.cs
+++ b/Source/Src/KZDev.PerfUtils/MemoryStream/Internals/SegmentMemoryStreamSlim.cs
@@ -464,6 +464,45 @@ private static void StoreBufferList (List<SegmentBufferVirtualInfo> bufferList)
 
         #region Rent and Release Buffer Management
 
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Rents a standard buffer from the buffer array pool.
+        /// </summary>
+        /// <param name="requestedBufferSize">
+        /// The desired size of the buffer to rent.
+        /// </param>
+        /// <param name="forceZeroBytes">
+        /// If <c>true</c>, then the buffer will be zeroed out before returning it, regardless
+        /// of the settings for zeroing out buffers.
+        /// </param>
+        /// <param name="preferredBlockInfo">
+        /// Information about the last block that was used to allocate a buffer. This is used
+        /// to try and allocate from the same block and next segment if possible
+        /// </param>
+        /// <returns>
+        /// The rented buffer and a flag indicating if the returned buffer is the next segment
+        /// from the preferred block.
+        /// </returns>
+        private (SegmentBuffer Buffer, bool IsNextBlockSegment) RentStandardBufferFromPreferredBlock
+            (int requestedBufferSize, bool forceZeroBytes, in SegmentBufferInfo preferredBlockInfo)
+        {
+            // If the preferred block info is the default, then just rent a standard buffer.
+            if (preferredBlockInfo.BufferPool is null)
+                return (RentStandardBuffer(requestedBufferSize, forceZeroBytes), false);
+
+            // Note - our buffer pool is a custom pool that only we will be using, so we don't 
+            // have to worry about non-cleared data from other users; but, it is static and 
+            // different instances of the stream may or may not have different security requirements,
+            // so if our settings are to clear the buffer, then we will clear it before returning it,
+            // but this is only done if the segments weren't cleared when they were stored.
+            MemorySegmentedBufferPool currentBufferPool = Volatile.Read(ref _bufferArrayPool);
+            // We do need to check if the current buffer pool is the same as the preferred block info.
+            if (currentBufferPool != preferredBlockInfo.BufferPool)
+                return (RentStandardBuffer(requestedBufferSize, forceZeroBytes), false);
+            return currentBufferPool.RentFromPreferredBlock(requestedBufferSize,
+                forceZeroBytes || (Settings.ZeroBufferBehavior != MemoryStreamSlimZeroBufferOption.None),
+                preferredBlockInfo);
+        }
         //--------------------------------------------------------------------------------
         /// <summary>
         /// Rents a standard buffer from the buffer array pool.
@@ -666,9 +705,7 @@ private void AddSegmentBufferToList (in SegmentBuffer newBuffer)
                 _bufferList.Add(new SegmentBufferVirtualInfo(newBuffer, newBuffer.Length, newBuffer.SegmentCount));
                 return;
             }
-            SegmentBufferVirtualInfo previousListBuffer = _bufferList[^1];
-            _bufferList.Add(new SegmentBufferVirtualInfo(newBuffer, newBuffer.Length + previousListBuffer.SegmentEndOffset,
-                newBuffer.SegmentCount + previousListBuffer.SegmentEndCount));
+            _bufferList.Add(SegmentBufferVirtualInfo.FromPrevious(newBuffer, _bufferList[^1]));
         }
         //--------------------------------------------------------------------------------
         /// <summary>
@@ -839,8 +876,58 @@ private void EnsureStandardBuffersCapacity (long capacityNeeded, bool forceZeroB
             // Now, allocate the rest of the standard buffers needed
             while (capacityNeeded > 0)
             {
-                SegmentBuffer nextBuffer = RentStandardBuffer((int)capacityNeeded, forceZeroBytes);
-                AddSegmentBufferToList(nextBuffer);
+                if (0 == _bufferList.Count)
+                {
+                    SegmentBuffer newBuffer = RentStandardBuffer((int)capacityNeeded, forceZeroBytes);
+                    AddSegmentBufferToList(newBuffer);
+                    capacityNeeded -= newBuffer.Length;
+                    continue;
+                }
+                // Get the next buffer from the preferred block if possible. We want to get some
+                // segments that are immediately after the last segment in the last buffer in the list
+                // if possible. This means we don't have to have another entry in the list, and we can
+                // just extend the last buffer in the list.
+                SegmentBuffer lastBuffer = _bufferList[^1].SegmentBuffer;
+                SegmentBufferInfo lastBufferInfo = lastBuffer.BufferInfo;
+                (SegmentBuffer nextBuffer, bool isNextBlockSegment) =
+                    RentStandardBufferFromPreferredBlock((int)capacityNeeded, forceZeroBytes, lastBufferInfo);
+
+                if (!isNextBlockSegment)
+                {
+                    // We couldn't get the preferred block, so we need to add a new buffer to the list
+                    AddSegmentBufferToList(nextBuffer);
+                    capacityNeeded -= nextBuffer.Length;
+                    continue;
+                }
+
+                // If the segment is from the next block, then we have just essentially
+                // extended the last buffer in the list. Update the information in the last
+                // buffer in the list to reflect the new buffer.
+                MemorySegment lastMemorySegment = lastBuffer.MemorySegment;
+
+                // Since we're extending the last buffer in the list, we need to be sure that 
+                // the current buffer will be properly selected when it's needed.
+                _currentBufferInvalid = true;
+                // We also check the current buffer information because....
+                //   It is a value type and so it is copied, and 
+                //   For efficiency, we don't replace _currentBufferInfo when selecting the current buffer
+                //       unless the index is different from the calculated current buffer index (in SelectCurrentBuffer())
+                if (_currentBufferInfo.Index == _bufferList.Count - 1)
+                    // Clear this out to force the current buffer to be recalculated
+                    _currentBufferInfo = CurrentBufferInfo.Empty;
+
+                // Now, we need to replace the last buffer in the list with the new buffer
+                SegmentBuffer replaceBuffer = lastBuffer.Concat(nextBuffer);
+
+                // Replace the last buffer in the list with the new buffer
+                if (_bufferList.Count == 1)
+                    _bufferList[^1] = new SegmentBufferVirtualInfo(replaceBuffer, replaceBuffer.Length, replaceBuffer.SegmentCount);
+                else
+                {
+                    // Adjust the virtual information for the last buffer in the list based on the 
+                    // new buffer and the second to last buffer in the list.
+                    _bufferList[^1] = SegmentBufferVirtualInfo.FromPrevious(replaceBuffer, _bufferList[^2]);
+                }
                 capacityNeeded -= nextBuffer.Length;
             }
         }
@@ -949,9 +1036,7 @@ private void ReduceCapacity (int requestedCapacity)
                         _bufferList[0] = new SegmentBufferVirtualInfo(newBuffer, newBuffer.Length, newBuffer.SegmentCount);
                     else
                     {
-                        SegmentBufferVirtualInfo previousListBuffer = _bufferList[^2];
-                        _bufferList[^1] = new SegmentBufferVirtualInfo(newBuffer, newBuffer.Length + previousListBuffer.SegmentEndOffset,
-                            newBuffer.SegmentCount + previousListBuffer.SegmentEndCount);
+                        _bufferList[^1] = SegmentBufferVirtualInfo.FromPrevious(newBuffer, _bufferList[^2]);
                     }
                     break;
                 }
@@ -1028,15 +1113,14 @@ private void OffsetPositionAndSetCurrentBuffer (int offsetPosition)
                     return;
                 }
             }
-            else
             // offsetPosition is negative - Check if we just moved within the same current buffer
-            if ((_currentBufferOffset + offsetPosition) >= 0)
+            else if ((_currentBufferOffset + offsetPosition) >= 0)
             {
                 _currentBufferOffset += offsetPosition;
                 PositionInternal += offsetPosition;
                 return;
             }
-            SetPositionAndCurrentBuffer(VirtualPosition + offsetPosition);
+            SetPositionAndCurrentBuffer(PositionInternal + offsetPosition);
         }
         //--------------------------------------------------------------------------------
         /// <summary>
@@ -1103,7 +1187,7 @@ private long SeekInternal (long offset, long fromLocation)
             // Based on the current position, we need to determine the buffer index and offset into that buffer
             if (offset == 0)
                 return (0, 0);
-            if (offset > _bufferList![^1].SegmentEndOffset)
+            if (offset >= _bufferList![^1].SegmentEndOffset)
                 // This is a special case where the virtual offset is beyond the end of the last buffer, so we need
                 // to return -1 as the index.
                 return (-1, 0);
@@ -1669,6 +1753,11 @@ public override async Task CopyToAsync (Stream destination, int bufferSize, Canc
             ValidateCopyToArguments(destination, bufferSize);
             EnsureNotClosed();
 
+            // If we have no data, then we have nothing to copy
+            int bytesToCopy = LengthInternal - PositionInternal;
+            if (bytesToCopy <= 0)
+                return;
+
             if (destination is MemoryStreamSlim or MemoryStream)
             {
                 // We can optimize the copy operation by copying synchronously instead of asynchronously
@@ -1676,11 +1765,6 @@ public override async Task CopyToAsync (Stream destination, int bufferSize, Canc
                 return;
             }
 
-            // If we have no data, then we have nothing to copy
-            int bytesToCopy = LengthInternal - PositionInternal;
-            if (bytesToCopy <= 0)
-                return;
-
             VerifyCurrentBuffer();
             // If we have a small buffer, then we can just copy the remaining data from the small buffer
             if (_currentBufferInfo.IsSmallBuffer)
@@ -1694,19 +1778,38 @@ public override async Task CopyToAsync (Stream destination, int bufferSize, Canc
             int bufferOffset = _currentBufferOffset;   // Offset into the buffer being copied from
             int bufferIndex = _currentBufferInfo.Index;
             int newPosition = VirtualPosition;
+
+            // Set up the first write task
+            // We are not using a small buffer and length is not zero, so we must have a buffer list
+            SegmentBuffer currentBuffer = _bufferList![bufferIndex++].SegmentBuffer;
+            int copyLength = Math.Min(currentBuffer.Length - bufferOffset, bytesToCopy);
+
+            MemorySegment memorySegment = currentBuffer.MemorySegment;
+            ReadOnlyMemory<byte> writeMemory = memorySegment.AsReadOnlyMemory().Slice(bufferOffset, copyLength);
+            // Get the first write task
+            ValueTask writeTask = destination.WriteAsync(writeMemory, cancellationToken);
+            bytesToCopy -= copyLength;
+            newPosition += copyLength;
+
             while (bytesToCopy > 0)
             {
-                // We are not using a small buffer and length is not zero, so we must have a buffer list
-                SegmentBuffer currentBuffer = _bufferList![bufferIndex++].SegmentBuffer;
-                int copyLength = Math.Min(currentBuffer.Length - bufferOffset, bytesToCopy);
-
-                MemorySegment memorySegment = currentBuffer.MemorySegment;
-                await destination.WriteAsync(memorySegment.AsReadOnlyMemory().Slice(bufferOffset, copyLength), cancellationToken).ConfigureAwait(false);
+                // We loop through the buffers and write the data to the destination stream by doing the
+                // setup for the next write as the previous write is running asynchronously.
+                currentBuffer = _bufferList![bufferIndex++].SegmentBuffer;
+                copyLength = Math.Min(currentBuffer.Length, bytesToCopy);
+
+                memorySegment = currentBuffer.MemorySegment;
+                writeMemory = memorySegment.AsReadOnlyMemory()[..copyLength];
+
+                // Await the previous write task
+                await writeTask.ConfigureAwait(false);
+                // Move on to the next write task
+                writeTask = destination.WriteAsync(writeMemory, cancellationToken);
                 bytesToCopy -= copyLength;
                 newPosition += copyLength;
-                // For the remaining buffers, we will start at the beginning of the buffer
-                bufferOffset = 0;
             }
+            // Await the final write task
+            await writeTask.ConfigureAwait(false);
             SetPositionAndCurrentBuffer(newPosition);
         }
         //--------------------------------------------------------------------------------
@@ -1940,11 +2043,18 @@ public override void SetLength (long value)
             {
                 // We need to ensure that we have the capacity for the new length
                 EnsureCapacity(newLength, true);
+                // Verify the current buffer in case that buffer is a small buffer. If we are using a buffer list,
+                // then we don't really need to verify the current buffer, but it has likely been invalidated by
+                // the EnsureCapacity call, so we will verify it anyway. There are cases where calling this while
+                // using a buffer list could result in the current buffer still being invalid, but with the buffer list
+                // case, we are clearing the buffers directly below anyway.
+                // BTW: The case where the buffer could still be invalid is when the current position is right beyond
+                // the last buffer in the list (Position == Length == Capacity).
                 VerifyCurrentBuffer();
             }
             // If the new length is greater than the current length, then we need to zero out the
             // remainder of our current buffer. Any new buffers will be zeroed out when they are allocated.
-            if (newLength > LengthInternal && !_currentBufferInfo.Buffer.IsEmpty)
+            if (newLength > LengthInternal)
             {
                 if (_currentBufferInfo.IsSmallBuffer)
                 {
@@ -1998,7 +2108,7 @@ public override byte[] ToArray ()
             {
                 SegmentBuffer currentBuffer = _bufferList![bufferIndex++].SegmentBuffer;
                 int copyLength = Math.Min(currentBuffer.Length, bytesToCopy);
-                currentBuffer[..copyLength].CopyTo(returnArray.AsSpan(bufferOffset));
+                currentBuffer[..copyLength].CopyTo(returnArray.AsSpan(bufferOffset, copyLength));
                 bufferOffset += copyLength;
                 bytesToCopy -= copyLength;
             }
@@ -2094,7 +2204,7 @@ public override void Write (ReadOnlySpan<byte> buffer)
 
             // Copy the data to the stream
             // Write the data to the current buffer
-            buffer[..copyCount].CopyTo(_currentBufferInfo.Buffer.AsSpan(_currentBufferOffset, copyCount));
+            buffer.CopyTo(_currentBufferInfo.Buffer.AsSpan(_currentBufferOffset, copyCount));
             // Update the position and count values
             int newPosition = VirtualPosition + copyCount;
 
diff --git a/Source/Src/KZDev.PerfUtils/MemoryStream/MemoryStreamSlim.cs b/Source/Src/KZDev.PerfUtils/MemoryStream/MemoryStreamSlim.cs
index 59d3cde..7189ebf 100644
--- a/Source/Src/KZDev.PerfUtils/MemoryStream/MemoryStreamSlim.cs
+++ b/Source/Src/KZDev.PerfUtils/MemoryStream/MemoryStreamSlim.cs
@@ -993,11 +993,13 @@ public static void SetGlobalDefaultSettings<TState> (Action<MemoryStreamSlimOpti
 
         //--------------------------------------------------------------------------------
         /// <inheritdoc />
+#pragma warning disable HAA0601
         public override string ToString () =>
             IsDisposed ?
                 $@"(Disposed) ID = {Id}" :
                 IsOpen ? $@"ID = {Id}, Length = {Length}, Position = {Position}, Mode = {Mode.GetString()}" :
                     $@"(Closed) ID = {Id}";
+#pragma warning restore HAA0601
         //--------------------------------------------------------------------------------
 
         #endregion Overrides of Object
diff --git a/Source/Src/KZDev.PerfUtils/Package/nuget.readme.md b/Source/Src/KZDev.PerfUtils/Package/nuget.readme.md
index 7fa0a42..29b8df6 100644
--- a/Source/Src/KZDev.PerfUtils/Package/nuget.readme.md
+++ b/Source/Src/KZDev.PerfUtils/Package/nuget.readme.md
@@ -1,6 +1,6 @@
 # KZDev.PerfUtils
 
-This package contains the `MemoryStreamSlim` class; a high-performance, memory-efficient, and easy-to-use replacement for the `MemoryStream` class that provides particular benefits for large or frequently used streams.
+This package contains the `MemoryStreamSlim` class; a high-performance, memory-efficient, and easy-to-use replacement for the `MemoryStream` class that provides particular performance benefits for large or frequently used streams. The package also contains the `InterlockedOps` class, which provides additional atomic thread-safe operations to extend the functionality of the `Interlocked` class in the .NET Class Library.
 
 ## Features
 
@@ -12,7 +12,37 @@ This package contains the `MemoryStreamSlim` class; a high-performance, memory-e
 * Simple replacement for `MemoryStream` with the same API, other than the constructor.
 * Optionally allows using native memory for storage, which allows even more flexibility to minimize GC pressure.
 
-## Example
+`InterlockedOps` is a static class providing the following thread-safe atomic operations:
+
+* Xor : Exclusive OR operation on any integer types.
+* ClearBits : Clear bits on any integer types.
+* SetBits : Set bits on any integer types.
+* ConditionAnd : Conditionally update bits using an AND operation on any integer types.
+* ConditionOr : Conditionally update bits using an OR operation on any integer types.
+* ConditionXor : Conditionally update bits using an XOR operation on any integer types.
+* ConditionClearBits : Conditionally clear bits on any integer types.
+* ConditionSetBits : Conditionally set bits on any integer types.
+
+## InterlockedOps Example
+
+Below is an example of how to use the `InterlockedOps` class to perform an atomic XOR operation on an integer variable. The `Xor` method is used to toggle a bit flag between `1` and `0` in a thread-safe manner and returns a boolean value indicating if the bit flag was set to 1.
+
+```csharp
+using KZDev.PerfUtils;
+
+public class XorExample
+{
+    private int _flag;
+
+    public bool ToggleFlag ()
+    {
+        int originalValue = InterlockedOps.Xor(ref _flag, 1);
+        return originalValue == 0;
+    }
+}
+```
+
+## MemoryStreamSlim Example
 
 Below is an example of how to use the `MemoryStreamSlim` class. Other than instantiation using the `Create` method, the API is identical to the standard `MemoryStream` class. It is always a best practice to dispose of the `MemoryStreamSlim` instance when it is no longer needed.
 
@@ -34,7 +64,7 @@ using (MemoryStreamSlim stream = MemoryStreamSlim.Create())
 }
 ```
 
-## Compare to RecyclableMemoryStream
+### Compare to RecyclableMemoryStream
 
 The `MemoryStreamSlim` class is similar in concept and purpose to the [`RecyclableMemoryStream`](https://www.nuget.org/packages/Microsoft.IO.RecyclableMemoryStream) class from Microsoft however the internal implementation of buffer management is quite different. Also, compared to `RecyclableMemoryStream`, the `MemoryStreamSlim` class is designed to:
 
@@ -44,13 +74,15 @@ The `MemoryStreamSlim` class is similar in concept and purpose to the [`Recyclab
 * Incur fewer garbage collections.
 * Perform on par or better in terms of throughput performance.
 * Provide more consistent performance across different workloads.
-* Treat security as a priority and opt-out rather than opt-in.
+* Treat security as a priority and opt-out rather than opt-in zero'ing unused memory.
 * Optionally allow using native memory for storage to avoid GC pressure impact altogether.
 
+Performance comparisons are also available in the [Benchmarks](https://kzdev-net.github.io/kzdev.perfutils/articles/benchmarks.html) documentation section.
+
 ## Documentation
 
 Full documentation for the package is available on the [PerfUtils Documentation](https://kzdev-net.github.io/kzdev.perfutils/) page.
 
 ## Future Features
 
-The roadmap plan for this package is to add several additional helpful performance focused utilities. These will be forthcoming as time permits, so this first release is focused just on the `MemoryStreamSlim` class.
+The roadmap plan for this package is to add several additional helpful performance focused utilities. These will be forthcoming as time permits.
diff --git a/Source/Tst/Directory.Build.props b/Source/Tst/Directory.Build.props
index 834298b..efbc59d 100644
--- a/Source/Tst/Directory.Build.props
+++ b/Source/Tst/Directory.Build.props
@@ -12,4 +12,21 @@
     Import the next higher level Directory.Build.props file. 
    -->
     <Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)..\'))" />
+    <!-- 
+    Define test project package version properties
+   -->
+    <PropertyGroup Label="PackageVersions">
+        <PerfUtils-Pkg-Bogus>35.6.1</PerfUtils-Pkg-Bogus>
+        <PerfUtils-Pkg-coverlet_collector>6.0.2</PerfUtils-Pkg-coverlet_collector>
+        <PerfUtils-Pkg-FluentAssertions>6.12.1</PerfUtils-Pkg-FluentAssertions>
+        <PerfUtils-Pkg-Microsoft_NET_Test_Sdk>17.11.1</PerfUtils-Pkg-Microsoft_NET_Test_Sdk>
+        <PerfUtils-Pkg-Moq>4.20.72</PerfUtils-Pkg-Moq>
+        <PerfUtils-Pkg-xunit>2.9.2</PerfUtils-Pkg-xunit>
+        <PerfUtils-Pkg-xunit_runner_visualstudio>2.8.2</PerfUtils-Pkg-xunit_runner_visualstudio>
+        <PerfUtils-Pkg-XunitXml_TestLogger>4.1.0</PerfUtils-Pkg-XunitXml_TestLogger>
+    </PropertyGroup>
+
+    <PropertyGroup Condition="'$(TargetFramework)'=='net6.0'">
+        <PerfUtils-Pkg-System_Collections_Immutable>8.0.0</PerfUtils-Pkg-System_Collections_Immutable>
+    </PropertyGroup>
 </Project>
diff --git a/Source/Tst/KZDev.PerfUtils.Common.UnitTests/KZDev.PerfUtils.Common.UnitTests.csproj b/Source/Tst/KZDev.PerfUtils.Common.UnitTests/KZDev.PerfUtils.Common.UnitTests.csproj
index 09b8569..d435627 100644
--- a/Source/Tst/KZDev.PerfUtils.Common.UnitTests/KZDev.PerfUtils.Common.UnitTests.csproj
+++ b/Source/Tst/KZDev.PerfUtils.Common.UnitTests/KZDev.PerfUtils.Common.UnitTests.csproj
@@ -5,9 +5,9 @@
 	</PropertyGroup>
 
 	<ItemGroup>
-		<PackageReference Include="coverlet.collector" Version="6.0.2" />
-		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
-		<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
+		<PackageReference Include="coverlet.collector" Version="$(PerfUtils-Pkg-coverlet_collector)" />
+		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(PerfUtils-Pkg-Microsoft_NET_Test_Sdk)" />
+		<PackageReference Include="xunit.runner.visualstudio" Version="$(PerfUtils-Pkg-xunit_runner_visualstudio)" />
 	</ItemGroup>
 
 	<ItemGroup>
diff --git a/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/KZDev.PerfUtils.Concurrency.UnitTests.csproj b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/KZDev.PerfUtils.Concurrency.UnitTests.csproj
new file mode 100644
index 0000000..7fcf45b
--- /dev/null
+++ b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/KZDev.PerfUtils.Concurrency.UnitTests.csproj
@@ -0,0 +1,27 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+
+    <IsPackable>false</IsPackable>
+    <IsTestProject>true</IsTestProject>
+  </PropertyGroup>
+
+  <ItemGroup>
+      <PackageReference Include="coverlet.collector" Version="$(PerfUtils-Pkg-coverlet_collector)" />
+      <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(PerfUtils-Pkg-Microsoft_NET_Test_Sdk)" />
+      <PackageReference Include="xunit.runner.visualstudio" Version="$(PerfUtils-Pkg-xunit_runner_visualstudio)" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\Src\KZDev.PerfUtils\KZDev.PerfUtils.csproj" />
+    <ProjectReference Include="..\KZDev.PerfUtils.UnitTestBase\KZDev.PerfUtils.UnitTestBase.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Using Include="Xunit" />
+  </ItemGroup>
+
+</Project>
diff --git a/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps.cs b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps.cs
new file mode 100644
index 0000000..4e186d0
--- /dev/null
+++ b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps.cs
@@ -0,0 +1,78 @@
+// Copyright (c) Kevin Zehrer
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+
+using System.Diagnostics.CodeAnalysis;
+
+using Xunit.Abstractions;
+
+namespace KZDev.PerfUtils.Tests
+{
+    //################################################################################
+    /// <summary>
+    /// Unit tests for the <see cref="InterlockedOps"/> class.
+    /// </summary>
+    [Trait(TestConstants.TestTrait.Category, TestConstants.TestCategory.Concurrency)]
+    [ExcludeFromCodeCoverage]
+    public partial class UsingInterlockedOps : UnitTestBase
+    {
+        /// <summary>
+        /// The number of times to loop through the contention tests
+        /// </summary>
+        private const int ContentionTestLoopCount = 100_000;
+
+        /// <summary>
+        /// The number of times we loop through for simple condition based tests (non-contention)
+        /// </summary>
+        private const int ConditionTestLoopCount = 1_000_000;
+
+        /// <summary>
+        /// The number of test loops to run for simple bit manipulation operations
+        /// </summary>
+        private const int BitManagementTestLoopCount = 1_000_000;
+
+        /// <summary>
+        /// A test integer value that is used to test the <see cref="InterlockedOps"/> methods
+        /// with contention. This value is shared between threads, and we are counting on the
+        /// xunit test runner to treat all tests in this class as a collection so that there
+        /// is only one instance of this value since no two tests will run at the same time.
+        /// </summary>
+        private static int _testContentionInteger = 0;
+
+        /// <summary>
+        /// A test unsigned integer value that is used to test the <see cref="InterlockedOps"/> methods
+        /// with contention. This value is shared between threads, and we are counting on the
+        /// xunit test runner to treat all tests in this class as a collection so that there
+        /// is only one instance of this value since no two tests will run at the same time.
+        /// </summary>
+        private static uint _testContentionUnsignedInteger = 0;
+
+        /// <summary>
+        /// A test long integer value that is used to test the <see cref="InterlockedOps"/> methods
+        /// with contention. This value is shared between threads, and we are counting on the
+        /// xunit test runner to treat all tests in this class as a collection so that there
+        /// is only one instance of this value since no two tests will run at the same time.
+        /// </summary>
+        private static long _testContentionLongInteger = 0;
+
+        /// <summary>
+        /// A test unsigned long integer value that is used to test the <see cref="InterlockedOps"/> methods
+        /// with contention. This value is shared between threads, and we are counting on the
+        /// xunit test runner to treat all tests in this class as a collection so that there
+        /// is only one instance of this value since no two tests will run at the same time.
+        /// </summary>
+        private static ulong _testContentionUnsignedLongInteger = 0;
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Initializes a new instance of the <see cref="UsingInterlockedOps"/> class.
+        /// </summary>
+        /// <param name="xUnitTestOutputHelper">
+        /// The Xunit test output helper that can be used to output test messages
+        /// </param>
+        public UsingInterlockedOps (ITestOutputHelper xUnitTestOutputHelper) : base(xUnitTestOutputHelper)
+        {
+        }
+        //--------------------------------------------------------------------------------
+    }
+    //################################################################################
+}
diff --git a/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ClearBits.cs b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ClearBits.cs
new file mode 100644
index 0000000..fcdd003
--- /dev/null
+++ b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ClearBits.cs
@@ -0,0 +1,161 @@
+// Copyright (c) Kevin Zehrer
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+
+using FluentAssertions;
+
+namespace KZDev.PerfUtils.Tests
+{
+    //################################################################################
+    /// <summary>
+    /// Unit tests for the <see cref="InterlockedOps"/> ClearBits operations.
+    /// </summary>
+    public partial class UsingInterlockedOps
+    {
+        #region ClearBits Tests
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ClearBits(ref int, int)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ClearBitsInteger_SavesProperResult ()
+        {
+            int variable = GetTestInteger();
+
+            // Run the test a bunch of times
+            for (int loop = 0; loop < BitManagementTestLoopCount; loop++)
+            {
+                int originalValue = variable;
+                int operationValue = GetTestInteger();
+                (int operationOriginalValue, int newValue) = InterlockedOps.ClearBits(ref variable, operationValue);
+                operationOriginalValue.Should().Be(originalValue);
+                variable.Should().Be(originalValue & ~operationValue);
+                newValue.Should().Be(variable);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ClearBits(ref uint, uint)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ClearBitsUnsignedInteger_SavesProperResult ()
+        {
+            uint variable = GetTestUnsignedInteger();
+
+            // Run the test a bunch of times
+            for (int loop = 0; loop < BitManagementTestLoopCount; loop++)
+            {
+                uint originalValue = variable;
+                uint operationValue = GetTestUnsignedInteger();
+                (uint operationOriginalValue, uint newValue) = InterlockedOps.ClearBits(ref variable, operationValue);
+                operationOriginalValue.Should().Be(originalValue);
+                variable.Should().Be(originalValue & ~operationValue);
+                newValue.Should().Be(variable);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ClearBits(ref long, long)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ClearBitsLongInteger_SavesProperResult ()
+        {
+            long variable = GetTestLongInteger();
+
+            // Run the test a bunch of times
+            for (long loop = 0; loop < BitManagementTestLoopCount; loop++)
+            {
+                long originalValue = variable;
+                long operationValue = GetTestLongInteger();
+                (long operationOriginalValue, long newValue) = InterlockedOps.ClearBits(ref variable, operationValue);
+                operationOriginalValue.Should().Be(originalValue);
+                variable.Should().Be(originalValue & ~operationValue);
+                newValue.Should().Be(variable);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ClearBits(ref ulong, ulong)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ClearBitsUnsignedLongInteger_SavesProperResult ()
+        {
+            ulong variable = GetTestUnsignedLongInteger();
+
+            // Run the test a bunch of times
+            for (long loop = 0; loop < BitManagementTestLoopCount; loop++)
+            {
+                ulong originalValue = variable;
+                ulong operationValue = GetTestUnsignedLongInteger();
+                (ulong operationOriginalValue, ulong newValue) = InterlockedOps.ClearBits(ref variable, operationValue);
+                operationOriginalValue.Should().Be(originalValue);
+                variable.Should().Be(originalValue & ~operationValue);
+                newValue.Should().Be(variable);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ClearBits(ref int, int)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ClearBitsInteger_WithContention_SavesProperResult ()
+        {
+            const int clearBitsValue = 0x4000_0000;
+            UsingInterlockedOps_IntegerOperation_WithContention_SavesProperResult(null, () =>
+                    InterlockedOps.ClearBits(ref _testContentionInteger, clearBitsValue),
+                clearBitsValue, clearBitsValue - 1, incrementValue => (incrementValue & clearBitsValue) == 0,
+                (incrementValue, compareValue) => incrementValue.Should().Be(compareValue & ~clearBitsValue));
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ClearBits(ref uint, uint)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ClearBitsUnsignedInteger_WithContention_SavesProperResult ()
+        {
+            const uint clearBitsValue = 0x8000_0000;
+            UsingInterlockedOps_UnsignedIntegerOperation_WithContention_SavesProperResult(null, () =>
+                    InterlockedOps.ClearBits(ref _testContentionUnsignedInteger, clearBitsValue),
+                clearBitsValue, clearBitsValue - 1, incrementValue => (incrementValue & clearBitsValue) == 0,
+                (incrementValue, compareValue) => incrementValue.Should().Be(compareValue & ~clearBitsValue));
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ClearBits(ref long, long)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ClearBitsLongInteger_WithContention_SavesProperResult ()
+        {
+            const long clearBitsValue = 0x4000_0000_0000_0000;
+            UsingInterlockedOps_LongIntegerOperation_WithContention_SavesProperResult(null, () =>
+                    InterlockedOps.ClearBits(ref _testContentionLongInteger, clearBitsValue),
+                clearBitsValue, clearBitsValue - 1, incrementValue => (incrementValue & clearBitsValue) == 0,
+                (incrementValue, compareValue) => incrementValue.Should().Be(compareValue & ~clearBitsValue));
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ClearBits(ref ulong, ulong)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ClearBitsUnsignedLongInteger_WithContention_SavesProperResult ()
+        {
+            const ulong clearBitsValue = 0x8000_0000_0000_0000;
+            UsingInterlockedOps_UnsignedLongIntegerOperation_WithContention_SavesProperResult(null, () =>
+                    InterlockedOps.ClearBits(ref _testContentionUnsignedLongInteger, clearBitsValue),
+                clearBitsValue, clearBitsValue - 1, incrementValue => (incrementValue & clearBitsValue) == 0,
+                (incrementValue, compareValue) => incrementValue.Should().Be(compareValue & ~clearBitsValue));
+        }
+        //--------------------------------------------------------------------------------    
+
+        #endregion ClearBits Tests
+    }
+    //################################################################################
+}
diff --git a/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ConditionalAnd.cs b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ConditionalAnd.cs
new file mode 100644
index 0000000..d9c04e9
--- /dev/null
+++ b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ConditionalAnd.cs
@@ -0,0 +1,630 @@
+// Copyright (c) Kevin Zehrer
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+
+using FluentAssertions;
+// ReSharper disable AccessToModifiedClosure
+#pragma warning disable HAA0301
+
+namespace KZDev.PerfUtils.Tests
+{
+    //################################################################################
+    /// <summary>
+    /// Unit tests for the <see cref="InterlockedOps"/> Conditional And operations.
+    /// </summary>
+    public partial class UsingInterlockedOps
+    {
+        #region Conditional And Tests
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd(ref int, Predicate{int}, int)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionAndInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int compareValue = variable + 5;
+                int operationValue = GetTestInteger();
+                (int originalValue, int newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd{T}(ref int, Func{int, T, bool}, T, int)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionAndInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int compareValue = variable + 5;
+                int operationValue = GetTestInteger();
+                (int originalValue, int newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd(ref uint, Predicate{uint}, uint)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionAndUnsignedInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger();
+                uint compareValue = variable + 5;
+                uint operationValue = GetTestUnsignedInteger();
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd{T}(ref uint, Func{uint, T, bool}, T, uint)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionAndUnsignedInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger();
+                uint compareValue = variable + 5;
+                uint operationValue = GetTestUnsignedInteger();
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd(ref long, Predicate{long}, long)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionAndLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger();
+                long compareValue = variable + 5;
+                long operationValue = GetTestLongInteger();
+                (long originalValue, long newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd{T}(ref long, Func{long, T, bool}, T, long)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionAndLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger();
+                long compareValue = variable + 5;
+                long operationValue = GetTestLongInteger();
+                (long originalValue, long newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd(ref ulong, Predicate{ulong}, ulong)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionAndUnsignedLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger();
+                ulong compareValue = variable + 5;
+                ulong operationValue = GetTestUnsignedLongInteger();
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionAndUnsignedLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger();
+                ulong compareValue = variable + 5;
+                ulong operationValue = GetTestUnsignedLongInteger();
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd(ref int, Predicate{int}, int)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionAndInteger_ConditionReturnsFalse_VariableIsUnchanged()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int initialValue = variable;
+                (int originalValue, int newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    _ => false, GetTestInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd{T}(ref int, Func{int, T, bool}, T, int)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionAndInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int initialValue = variable;
+                (int originalValue, int newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd(ref uint, Predicate{uint}, uint)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionAndUnsignedInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger(0, uint.MaxValue / 2);
+                uint initialValue = variable;
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    _ => false, GetTestUnsignedInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd{T}(ref uint, Func{uint, T, bool}, T, uint)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionAndUnsignedInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger(0, uint.MaxValue / 2);
+                uint initialValue = variable;
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestUnsignedInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd(ref long, Predicate{long}, long)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionAndLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger(0, long.MaxValue / 2);
+                long initialValue = variable;
+                (long originalValue, long newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    _ => false, GetTestLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd{T}(ref long, Func{long, T, bool}, T, long)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionAndLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger(0, long.MaxValue / 2);
+                long initialValue = variable;
+                (long originalValue, long newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd(ref ulong, Predicate{ulong}, ulong)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionAndUnsignedLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger(0, ulong.MaxValue / 2);
+                ulong initialValue = variable;
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    _ => false, GetTestUnsignedLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionAndUnsignedLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger(0, ulong.MaxValue / 2);
+                ulong initialValue = variable;
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionAnd(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestUnsignedLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd(ref int, Predicate{int}, int)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionAndInteger_WithContention_SavesProperResult ()
+        {
+            const int maxIncrement = 0x0FFF_FFFF;
+            const int andValue = 0x4000_0000 | maxIncrement;
+            const int clearBitValue = 0x2000_0000;
+            const int startValue = andValue | clearBitValue;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_IntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0, 
+                () => InterlockedOps.ConditionAnd(ref _testContentionInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, andValue),
+                startValue, maxIncrement, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & andValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd{T}(ref int, Func{int, T, bool}, T, int)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionAndInteger_WithContention_SavesProperResult ()
+        {
+            const int maxIncrement = 0x0FFF_FFFF;
+            const int andValue = 0x4000_0000 | maxIncrement;
+            const int clearBitValue = 0x2000_0000;
+            const int startValue = andValue | clearBitValue;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_IntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionAnd(ref _testContentionInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, andValue),
+                startValue, maxIncrement, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & andValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd(ref uint, Predicate{uint}, uint)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionAndUnsignedInteger_WithContention_SavesProperResult ()
+        {
+            const uint maxIncrement = 0x0FFF_FFFF;
+            const uint andValue = 0x8000_0000 | maxIncrement;
+            const uint clearBitValue = 0x4000_0000;
+            const uint startValue = andValue | clearBitValue;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionAnd(ref _testContentionUnsignedInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, andValue),
+                startValue, maxIncrement, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & andValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd{T}(ref uint, Func{uint, T, bool}, T, uint)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionAndUnsignedInteger_WithContention_SavesProperResult ()
+        {
+            const uint maxIncrement = 0x0FFF_FFFF;
+            const uint andValue = 0x8000_0000 | maxIncrement;
+            const uint clearBitValue = 0x4000_0000;
+            const uint startValue = andValue | clearBitValue;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionAnd(ref _testContentionUnsignedInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, andValue),
+                startValue, maxIncrement, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & andValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd(ref long, Predicate{long}, long)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionAndLongInteger_WithContention_SavesProperResult ()
+        {
+            const long maxIncrement = 0x0FFF_FFFF_FFFF_FFFF;
+            const long andValue = 0x4000_0000_0000_0000 | maxIncrement;
+            const long clearBitValue = 0x2000_0000_0000_0000;
+            const long startValue = andValue | clearBitValue;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_LongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionAnd(ref _testContentionLongInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, andValue),
+                startValue, maxIncrement, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & andValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd{T}(ref long, Func{long, T, bool}, T, long)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionAndLongInteger_WithContention_SavesProperResult ()
+        {
+            const long maxIncrement = 0x0FFF_FFFF_FFFF_FFFF;
+            const long andValue = 0x4000_0000_0000_0000 | maxIncrement;
+            const long clearBitValue = 0x2000_0000_0000_0000;
+            const long startValue = andValue | clearBitValue;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_LongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionAnd(ref _testContentionLongInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, andValue),
+                startValue, maxIncrement, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & andValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd(ref ulong, Predicate{ulong}, ulong)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionAndUnsignedLongInteger_WithContention_SavesProperResult ()
+        {
+            const ulong maxIncrement = 0x0FFF_FFFF_FFFF_FFFF;
+            const ulong andValue = 0x8000_0000_0000_0000 | maxIncrement;
+            const ulong clearBitValue = 0x4000_0000_0000_0000;
+            const ulong startValue = andValue | clearBitValue;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedLongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionAnd(ref _testContentionUnsignedLongInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, andValue),
+                startValue, maxIncrement, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & andValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionAnd{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionAndUnsignedLongInteger_WithContention_SavesProperResult ()
+        {
+            const ulong maxIncrement = 0x0FFF_FFFF_FFFF_FFFF;
+            const ulong andValue = 0x8000_0000_0000_0000 | maxIncrement;
+            const ulong clearBitValue = 0x4000_0000_0000_0000;
+            const ulong startValue = andValue | clearBitValue;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedLongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionAnd(ref _testContentionUnsignedLongInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, andValue),
+                startValue, maxIncrement, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & andValue);
+                });
+        }
+        //--------------------------------------------------------------------------------    
+        #endregion Conditional And Tests
+    }
+    //################################################################################
+}
diff --git a/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ConditionalClearBits.cs b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ConditionalClearBits.cs
new file mode 100644
index 0000000..4b9392c
--- /dev/null
+++ b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ConditionalClearBits.cs
@@ -0,0 +1,606 @@
+// Copyright (c) Kevin Zehrer
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+
+using FluentAssertions;
+// ReSharper disable AccessToModifiedClosure
+#pragma warning disable HAA0301
+
+namespace KZDev.PerfUtils.Tests
+{
+    //################################################################################
+    /// <summary>
+    /// Unit tests for the <see cref="InterlockedOps"/> Conditional ClearBits operations.
+    /// </summary>
+    public partial class UsingInterlockedOps
+    {
+        #region Conditional ClearBits Tests
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits(ref int, Predicate{int}, int)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionClearBitsInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int compareValue = variable + 5;
+                int operationValue = GetTestInteger();
+                (int originalValue, int newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & ~operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits{T}(ref int, Func{int, T, bool}, T, int)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionClearBitsInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int compareValue = variable + 5;
+                int operationValue = GetTestInteger();
+                (int originalValue, int newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & ~operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits(ref uint, Predicate{uint}, uint)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionClearBitsUnsignedInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger();
+                uint compareValue = variable + 5;
+                uint operationValue = GetTestUnsignedInteger();
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & ~operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits{T}(ref uint, Func{uint, T, bool}, T, uint)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionClearBitsUnsignedInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger();
+                uint compareValue = variable + 5;
+                uint operationValue = GetTestUnsignedInteger();
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & ~operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits(ref long, Predicate{long}, long)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionClearBitsLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger();
+                long compareValue = variable + 5;
+                long operationValue = GetTestLongInteger();
+                (long originalValue, long newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & ~operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits{T}(ref long, Func{long, T, bool}, T, long)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionClearBitsLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger();
+                long compareValue = variable + 5;
+                long operationValue = GetTestLongInteger();
+                (long originalValue, long newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & ~operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits(ref ulong, Predicate{ulong}, ulong)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionClearBitsUnsignedLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger();
+                ulong compareValue = variable + 5;
+                ulong operationValue = GetTestUnsignedLongInteger();
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & ~operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionClearBitsUnsignedLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger();
+                ulong compareValue = variable + 5;
+                ulong operationValue = GetTestUnsignedLongInteger();
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue & ~operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits(ref int, Predicate{int}, int)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionClearBitsInteger_ConditionReturnsFalse_VariableIsUnchanged()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int initialValue = variable;
+                (int originalValue, int newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    _ => false, GetTestInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits{T}(ref int, Func{int, T, bool}, T, int)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionClearBitsInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int initialValue = variable;
+                (int originalValue, int newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits(ref uint, Predicate{uint}, uint)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionClearBitsUnsignedInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger(0, uint.MaxValue / 2);
+                uint initialValue = variable;
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    _ => false, GetTestUnsignedInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits{T}(ref uint, Func{uint, T, bool}, T, uint)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionClearBitsUnsignedInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger(0, uint.MaxValue / 2);
+                uint initialValue = variable;
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestUnsignedInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits(ref long, Predicate{long}, long)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionClearBitsLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger(0, long.MaxValue / 2);
+                long initialValue = variable;
+                (long originalValue, long newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    _ => false, GetTestLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits{T}(ref long, Func{long, T, bool}, T, long)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionClearBitsLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger(0, long.MaxValue / 2);
+                long initialValue = variable;
+                (long originalValue, long newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits(ref ulong, Predicate{ulong}, ulong)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionClearBitsUnsignedLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger(0, ulong.MaxValue / 2);
+                ulong initialValue = variable;
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    _ => false, GetTestUnsignedLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionClearBitsUnsignedLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger(0, ulong.MaxValue / 2);
+                ulong initialValue = variable;
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionClearBits(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestUnsignedLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits(ref int, Predicate{int}, int)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionClearBitsInteger_WithContention_SavesProperResult ()
+        {
+            const int clearBitValue = 0x4000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_IntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0, 
+                () => InterlockedOps.ConditionClearBits(ref _testContentionInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, clearBitValue),
+                clearBitValue, clearBitValue - 1, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & ~clearBitValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits{T}(ref int, Func{int, T, bool}, T, int)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionClearBitsInteger_WithContention_SavesProperResult ()
+        {
+            const int clearBitValue = 0x4000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_IntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionClearBits(ref _testContentionInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, clearBitValue),
+                clearBitValue, clearBitValue - 1, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & ~clearBitValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits(ref uint, Predicate{uint}, uint)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionClearBitsUnsignedInteger_WithContention_SavesProperResult ()
+        {
+            const uint clearBitValue = 0x8000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionClearBits(ref _testContentionUnsignedInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, clearBitValue),
+                clearBitValue, clearBitValue - 1, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & ~clearBitValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits{T}(ref uint, Func{uint, T, bool}, T, uint)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionClearBitsUnsignedInteger_WithContention_SavesProperResult ()
+        {
+            const uint clearBitValue = 0x8000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionClearBits(ref _testContentionUnsignedInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, clearBitValue),
+                clearBitValue, clearBitValue - 1, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & ~clearBitValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits(ref long, Predicate{long}, long)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionClearBitsLongInteger_WithContention_SavesProperResult ()
+        {
+            const long clearBitValue = 0x4000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_LongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionClearBits(ref _testContentionLongInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, clearBitValue),
+                clearBitValue, clearBitValue - 1, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & ~clearBitValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits{T}(ref long, Func{long, T, bool}, T, long)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionClearBitsLongInteger_WithContention_SavesProperResult ()
+        {
+            const long clearBitValue = 0x4000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_LongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionClearBits(ref _testContentionLongInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, clearBitValue),
+                clearBitValue, clearBitValue - 1, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & ~clearBitValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits(ref ulong, Predicate{ulong}, ulong)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionClearBitsUnsignedLongInteger_WithContention_SavesProperResult ()
+        {
+            const ulong clearBitValue = 0x8000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedLongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionClearBits(ref _testContentionUnsignedLongInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, clearBitValue),
+                clearBitValue, clearBitValue - 1, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & ~clearBitValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionClearBits{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionClearBitsUnsignedLongInteger_WithContention_SavesProperResult ()
+        {
+            const ulong clearBitValue = 0x8000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedLongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionClearBits(ref _testContentionUnsignedLongInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, clearBitValue),
+                clearBitValue, clearBitValue - 1, incrementValue => (incrementValue & clearBitValue) == 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue & ~clearBitValue);
+                });
+        }
+        //--------------------------------------------------------------------------------    
+        #endregion Conditional ClearBits Tests
+    }
+    //################################################################################
+}
diff --git a/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ConditionalOr.cs b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ConditionalOr.cs
new file mode 100644
index 0000000..d08b2e5
--- /dev/null
+++ b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ConditionalOr.cs
@@ -0,0 +1,606 @@
+// Copyright (c) Kevin Zehrer
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+
+using FluentAssertions;
+// ReSharper disable AccessToModifiedClosure
+#pragma warning disable HAA0301
+
+namespace KZDev.PerfUtils.Tests
+{
+    //################################################################################
+    /// <summary>
+    /// Unit tests for the <see cref="InterlockedOps"/> Conditional Or operations.
+    /// </summary>
+    public partial class UsingInterlockedOps
+    {
+        #region Conditional Or Tests
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr(ref int, Predicate{int}, int)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionOrInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int compareValue = variable + 5;
+                int operationValue = GetTestInteger();
+                (int originalValue, int newValue) = InterlockedOps.ConditionOr(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr{T}(ref int, Func{int, T, bool}, T, int)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionOrInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int compareValue = variable + 5;
+                int operationValue = GetTestInteger();
+                (int originalValue, int newValue) = InterlockedOps.ConditionOr(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr(ref uint, Predicate{uint}, uint)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionOrUnsignedInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger();
+                uint compareValue = variable + 5;
+                uint operationValue = GetTestUnsignedInteger();
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionOr(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr{T}(ref uint, Func{uint, T, bool}, T, uint)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionOrUnsignedInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger();
+                uint compareValue = variable + 5;
+                uint operationValue = GetTestUnsignedInteger();
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionOr(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr(ref long, Predicate{long}, long)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionOrLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger();
+                long compareValue = variable + 5;
+                long operationValue = GetTestLongInteger();
+                (long originalValue, long newValue) = InterlockedOps.ConditionOr(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr{T}(ref long, Func{long, T, bool}, T, long)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionOrLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger();
+                long compareValue = variable + 5;
+                long operationValue = GetTestLongInteger();
+                (long originalValue, long newValue) = InterlockedOps.ConditionOr(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr(ref ulong, Predicate{ulong}, ulong)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionOrUnsignedLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger();
+                ulong compareValue = variable + 5;
+                ulong operationValue = GetTestUnsignedLongInteger();
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionOr(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionOrUnsignedLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger();
+                ulong compareValue = variable + 5;
+                ulong operationValue = GetTestUnsignedLongInteger();
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionOr(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr(ref int, Predicate{int}, int)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionOrInteger_ConditionReturnsFalse_VariableIsUnchanged()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int initialValue = variable;
+                (int originalValue, int newValue) = InterlockedOps.ConditionOr(ref variable,
+                    _ => false, GetTestInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr{T}(ref int, Func{int, T, bool}, T, int)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionOrInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int initialValue = variable;
+                (int originalValue, int newValue) = InterlockedOps.ConditionOr(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr(ref uint, Predicate{uint}, uint)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionOrUnsignedInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger(0, uint.MaxValue / 2);
+                uint initialValue = variable;
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionOr(ref variable,
+                    _ => false, GetTestUnsignedInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr{T}(ref uint, Func{uint, T, bool}, T, uint)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionOrUnsignedInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger(0, uint.MaxValue / 2);
+                uint initialValue = variable;
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionOr(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestUnsignedInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr(ref long, Predicate{long}, long)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionOrLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger(0, long.MaxValue / 2);
+                long initialValue = variable;
+                (long originalValue, long newValue) = InterlockedOps.ConditionOr(ref variable,
+                    _ => false, GetTestLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr{T}(ref long, Func{long, T, bool}, T, long)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionOrLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger(0, long.MaxValue / 2);
+                long initialValue = variable;
+                (long originalValue, long newValue) = InterlockedOps.ConditionOr(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr(ref ulong, Predicate{ulong}, ulong)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionOrUnsignedLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger(0, ulong.MaxValue / 2);
+                ulong initialValue = variable;
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionOr(ref variable,
+                    _ => false, GetTestUnsignedLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionOrUnsignedLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger(0, ulong.MaxValue / 2);
+                ulong initialValue = variable;
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionOr(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestUnsignedLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr(ref int, Predicate{int}, int)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionOrInteger_WithContention_SavesProperResult ()
+        {
+            const int orValue = 0x4000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_IntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionOr(ref _testContentionInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, orValue),
+                0, orValue - 1, incrementValue => (incrementValue & orValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | orValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr{T}(ref int, Func{int, T, bool}, T, int)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionOrInteger_WithContention_SavesProperResult ()
+        {
+            const int orValue = 0x4000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_IntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionOr(ref _testContentionInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, orValue),
+                0, orValue - 1, incrementValue => (incrementValue & orValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | orValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr(ref uint, Predicate{uint}, uint)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionOrUnsignedInteger_WithContention_SavesProperResult ()
+        {
+            const uint orValue = 0x8000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionOr(ref _testContentionUnsignedInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, orValue),
+                0, orValue - 1, incrementValue => (incrementValue & orValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | orValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr{T}(ref uint, Func{uint, T, bool}, T, uint)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionOrUnsignedInteger_WithContention_SavesProperResult ()
+        {
+            const uint orValue = 0x8000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionOr(ref _testContentionUnsignedInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, orValue),
+                0, orValue - 1, incrementValue => (incrementValue & orValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | orValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr(ref long, Predicate{long}, long)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionOrLongInteger_WithContention_SavesProperResult ()
+        {
+            const long orValue = 0x4000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_LongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionOr(ref _testContentionLongInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, orValue),
+                0, orValue - 1, incrementValue => (incrementValue & orValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | orValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr{T}(ref long, Func{long, T, bool}, T, long)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionOrLongInteger_WithContention_SavesProperResult ()
+        {
+            const long orValue = 0x4000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_LongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionOr(ref _testContentionLongInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, orValue),
+                0, orValue - 1, incrementValue => (incrementValue & orValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | orValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr(ref ulong, Predicate{ulong}, ulong)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionOrUnsignedLongInteger_WithContention_SavesProperResult ()
+        {
+            const ulong orValue = 0x8000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedLongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionOr(ref _testContentionUnsignedLongInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, orValue),
+                0, orValue - 1, incrementValue => (incrementValue & orValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | orValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionOr{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionOrUnsignedLongInteger_WithContention_SavesProperResult ()
+        {
+            const ulong orValue = 0x8000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedLongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionOr(ref _testContentionUnsignedLongInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, orValue),
+                0, orValue - 1, incrementValue => (incrementValue & orValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | orValue);
+                });
+        }
+        //--------------------------------------------------------------------------------    
+        #endregion Conditional Or Tests
+    }
+    //################################################################################
+}
diff --git a/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ConditionalSetBits.cs b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ConditionalSetBits.cs
new file mode 100644
index 0000000..c86d7c5
--- /dev/null
+++ b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ConditionalSetBits.cs
@@ -0,0 +1,606 @@
+// Copyright (c) Kevin Zehrer
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+
+using FluentAssertions;
+// ReSharper disable AccessToModifiedClosure
+#pragma warning disable HAA0301
+
+namespace KZDev.PerfUtils.Tests
+{
+    //################################################################################
+    /// <summary>
+    /// Unit tests for the <see cref="InterlockedOps"/> Conditional SetBits operations.
+    /// </summary>
+    public partial class UsingInterlockedOps
+    {
+        #region Conditional SetBits Tests
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits(ref int, Predicate{int}, int)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionSetBitsInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int compareValue = variable + 5;
+                int operationValue = GetTestInteger();
+                (int originalValue, int newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits{T}(ref int, Func{int, T, bool}, T, int)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionSetBitsInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int compareValue = variable + 5;
+                int operationValue = GetTestInteger();
+                (int originalValue, int newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits(ref uint, Predicate{uint}, uint)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionSetBitsUnsignedInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger();
+                uint compareValue = variable + 5;
+                uint operationValue = GetTestUnsignedInteger();
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits{T}(ref uint, Func{uint, T, bool}, T, uint)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionSetBitsUnsignedInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger();
+                uint compareValue = variable + 5;
+                uint operationValue = GetTestUnsignedInteger();
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits(ref long, Predicate{long}, long)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionSetBitsLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger();
+                long compareValue = variable + 5;
+                long operationValue = GetTestLongInteger();
+                (long originalValue, long newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits{T}(ref long, Func{long, T, bool}, T, long)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionSetBitsLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger();
+                long compareValue = variable + 5;
+                long operationValue = GetTestLongInteger();
+                (long originalValue, long newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits(ref ulong, Predicate{ulong}, ulong)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionSetBitsUnsignedLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger();
+                ulong compareValue = variable + 5;
+                ulong operationValue = GetTestUnsignedLongInteger();
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionSetBitsUnsignedLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger();
+                ulong compareValue = variable + 5;
+                ulong operationValue = GetTestUnsignedLongInteger();
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue | operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits(ref int, Predicate{int}, int)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionSetBitsInteger_ConditionReturnsFalse_VariableIsUnchanged()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int initialValue = variable;
+                (int originalValue, int newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    _ => false, GetTestInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits{T}(ref int, Func{int, T, bool}, T, int)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionSetBitsInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int initialValue = variable;
+                (int originalValue, int newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits(ref uint, Predicate{uint}, uint)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionSetBitsUnsignedInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger(0, uint.MaxValue / 2);
+                uint initialValue = variable;
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    _ => false, GetTestUnsignedInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits{T}(ref uint, Func{uint, T, bool}, T, uint)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionSetBitsUnsignedInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger(0, uint.MaxValue / 2);
+                uint initialValue = variable;
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestUnsignedInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits(ref long, Predicate{long}, long)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionSetBitsLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger(0, long.MaxValue / 2);
+                long initialValue = variable;
+                (long originalValue, long newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    _ => false, GetTestLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits{T}(ref long, Func{long, T, bool}, T, long)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionSetBitsLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger(0, long.MaxValue / 2);
+                long initialValue = variable;
+                (long originalValue, long newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits(ref ulong, Predicate{ulong}, ulong)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionSetBitsUnsignedLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger(0, ulong.MaxValue / 2);
+                ulong initialValue = variable;
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    _ => false, GetTestUnsignedLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionSetBitsUnsignedLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger(0, ulong.MaxValue / 2);
+                ulong initialValue = variable;
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionSetBits(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestUnsignedLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits(ref int, Predicate{int}, int)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionSetBitsInteger_WithContention_SavesProperResult ()
+        {
+            const int setBitsValue = 0x4000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_IntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionSetBits(ref _testContentionInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, setBitsValue),
+                0, setBitsValue - 1, incrementValue => (incrementValue & setBitsValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | setBitsValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits{T}(ref int, Func{int, T, bool}, T, int)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionSetBitsInteger_WithContention_SavesProperResult ()
+        {
+            const int setBitsValue = 0x4000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_IntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionSetBits(ref _testContentionInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, setBitsValue),
+                0, setBitsValue - 1, incrementValue => (incrementValue & setBitsValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | setBitsValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits(ref uint, Predicate{uint}, uint)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionSetBitsUnsignedInteger_WithContention_SavesProperResult ()
+        {
+            const uint setBitsValue = 0x8000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionSetBits(ref _testContentionUnsignedInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, setBitsValue),
+                0, setBitsValue - 1, incrementValue => (incrementValue & setBitsValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | setBitsValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits{T}(ref uint, Func{uint, T, bool}, T, uint)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionSetBitsUnsignedInteger_WithContention_SavesProperResult ()
+        {
+            const uint setBitsValue = 0x8000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionSetBits(ref _testContentionUnsignedInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, setBitsValue),
+                0, setBitsValue - 1, incrementValue => (incrementValue & setBitsValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | setBitsValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits(ref long, Predicate{long}, long)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionSetBitsLongInteger_WithContention_SavesProperResult ()
+        {
+            const long setBitsValue = 0x4000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_LongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionSetBits(ref _testContentionLongInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, setBitsValue),
+                0, setBitsValue - 1, incrementValue => (incrementValue & setBitsValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | setBitsValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits{T}(ref long, Func{long, T, bool}, T, long)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionSetBitsLongInteger_WithContention_SavesProperResult ()
+        {
+            const long setBitsValue = 0x4000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_LongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionSetBits(ref _testContentionLongInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, setBitsValue),
+                0, setBitsValue - 1, incrementValue => (incrementValue & setBitsValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | setBitsValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits(ref ulong, Predicate{ulong}, ulong)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionSetBitsUnsignedLongInteger_WithContention_SavesProperResult ()
+        {
+            const ulong setBitsValue = 0x8000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedLongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionSetBits(ref _testContentionUnsignedLongInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, setBitsValue),
+                0, setBitsValue - 1, incrementValue => (incrementValue & setBitsValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | setBitsValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionSetBits{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionSetBitsUnsignedLongInteger_WithContention_SavesProperResult ()
+        {
+            const ulong setBitsValue = 0x8000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedLongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionSetBits(ref _testContentionUnsignedLongInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, setBitsValue),
+                0, setBitsValue - 1, incrementValue => (incrementValue & setBitsValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | setBitsValue);
+                });
+        }
+        //--------------------------------------------------------------------------------    
+        #endregion Conditional SetBits Tests
+    }
+    //################################################################################
+}
diff --git a/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ConditionalXor.cs b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ConditionalXor.cs
new file mode 100644
index 0000000..273344d
--- /dev/null
+++ b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_ConditionalXor.cs
@@ -0,0 +1,606 @@
+// Copyright (c) Kevin Zehrer
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+
+using FluentAssertions;
+// ReSharper disable AccessToModifiedClosure
+#pragma warning disable HAA0301
+
+namespace KZDev.PerfUtils.Tests
+{
+    //################################################################################
+    /// <summary>
+    /// Unit tests for the <see cref="InterlockedOps"/> Conditional Xor operations.
+    /// </summary>
+    public partial class UsingInterlockedOps
+    {
+        #region Conditional Xor Tests
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor(ref int, Predicate{int}, int)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionXorInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int compareValue = variable + 5;
+                int operationValue = GetTestInteger();
+                (int originalValue, int newValue) = InterlockedOps.ConditionXor(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue ^ operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor{T}(ref int, Func{int, T, bool}, T, int)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionXorInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int compareValue = variable + 5;
+                int operationValue = GetTestInteger();
+                (int originalValue, int newValue) = InterlockedOps.ConditionXor(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue ^ operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor(ref uint, Predicate{uint}, uint)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionXorUnsignedInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger();
+                uint compareValue = variable + 5;
+                uint operationValue = GetTestUnsignedInteger();
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionXor(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue ^ operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor{T}(ref uint, Func{uint, T, bool}, T, uint)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionXorUnsignedInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger();
+                uint compareValue = variable + 5;
+                uint operationValue = GetTestUnsignedInteger();
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionXor(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue ^ operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor(ref long, Predicate{long}, long)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionXorLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger();
+                long compareValue = variable + 5;
+                long operationValue = GetTestLongInteger();
+                (long originalValue, long newValue) = InterlockedOps.ConditionXor(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue ^ operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor{T}(ref long, Func{long, T, bool}, T, long)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionXorLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger();
+                long compareValue = variable + 5;
+                long operationValue = GetTestLongInteger();
+                (long originalValue, long newValue) = InterlockedOps.ConditionXor(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue ^ operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor(ref ulong, Predicate{ulong}, ulong)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionXorUnsignedLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger();
+                ulong compareValue = variable + 5;
+                ulong operationValue = GetTestUnsignedLongInteger();
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionXor(ref variable,
+                    current =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareValue)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue ^ operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> method 
+        /// with no contention and variety of values
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionXorUnsignedLongInteger_SavesProperResult ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger();
+                ulong compareValue = variable + 5;
+                ulong operationValue = GetTestUnsignedLongInteger();
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionXor(ref variable,
+                    (current, compareTo) =>
+                    {
+                        // Cause the variable to change a number of times before allowing the operation
+                        if (current != compareTo)
+                            Interlocked.Increment(ref variable);
+                        return true;
+                    }, compareValue, operationValue);
+                originalValue.Should().Be(compareValue);
+                newValue.Should().Be(originalValue ^ operationValue);
+                variable.Should().Be(newValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor(ref int, Predicate{int}, int)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionXorInteger_ConditionReturnsFalse_VariableIsUnchanged()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int initialValue = variable;
+                (int originalValue, int newValue) = InterlockedOps.ConditionXor(ref variable,
+                    _ => false, GetTestInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor{T}(ref int, Func{int, T, bool}, T, int)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionXorInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                int variable = GetTestInteger(0, int.MaxValue / 2);
+                int initialValue = variable;
+                (int originalValue, int newValue) = InterlockedOps.ConditionXor(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor(ref uint, Predicate{uint}, uint)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionXorUnsignedInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger(0, uint.MaxValue / 2);
+                uint initialValue = variable;
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionXor(ref variable,
+                    _ => false, GetTestUnsignedInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor{T}(ref uint, Func{uint, T, bool}, T, uint)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionXorUnsignedInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                uint variable = GetTestUnsignedInteger(0, uint.MaxValue / 2);
+                uint initialValue = variable;
+                (uint originalValue, uint newValue) = InterlockedOps.ConditionXor(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestUnsignedInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor(ref long, Predicate{long}, long)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionXorLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger(0, long.MaxValue / 2);
+                long initialValue = variable;
+                (long originalValue, long newValue) = InterlockedOps.ConditionXor(ref variable,
+                    _ => false, GetTestLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor{T}(ref long, Func{long, T, bool}, T, long)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionXorLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                long variable = GetTestLongInteger(0, long.MaxValue / 2);
+                long initialValue = variable;
+                (long originalValue, long newValue) = InterlockedOps.ConditionXor(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor(ref ulong, Predicate{ulong}, ulong)"/> method 
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionXorUnsignedLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger(0, ulong.MaxValue / 2);
+                ulong initialValue = variable;
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionXor(ref variable,
+                    _ => false, GetTestUnsignedLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> method
+        /// with no contention and variety of values where the condition returns false, and the
+        /// variable should remain unchanged and the returned values should match the variable.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionXorUnsignedLongInteger_ConditionReturnsFalse_VariableIsUnchanged ()
+        {
+            // Run the test a bunch of times
+            for (int loop = 0; loop < ConditionTestLoopCount; loop++)
+            {
+                ulong variable = GetTestUnsignedLongInteger(0, ulong.MaxValue / 2);
+                ulong initialValue = variable;
+                (ulong originalValue, ulong newValue) = InterlockedOps.ConditionXor(ref variable,
+                    (_, returnValue) => returnValue, false, GetTestUnsignedLongInteger());
+                variable.Should().Be(initialValue);
+                originalValue.Should().Be(initialValue);
+                newValue.Should().Be(initialValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor(ref int, Predicate{int}, int)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionXorInteger_WithContention_SavesProperResult ()
+        {
+            const int xorValue = 0x4000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_IntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionXor(ref _testContentionInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, xorValue),
+                0, xorValue - 1, incrementValue => (incrementValue & xorValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | xorValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor{T}(ref int, Func{int, T, bool}, T, int)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionXorInteger_WithContention_SavesProperResult ()
+        {
+            const int xorValue = 0x4000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_IntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionXor(ref _testContentionInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, xorValue),
+                0, xorValue - 1, incrementValue => (incrementValue & xorValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | xorValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor(ref uint, Predicate{uint}, uint)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionXorUnsignedInteger_WithContention_SavesProperResult ()
+        {
+            const uint xorValue = 0x8000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionXor(ref _testContentionUnsignedInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, xorValue),
+                0, xorValue - 1, incrementValue => (incrementValue & xorValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | xorValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor{T}(ref uint, Func{uint, T, bool}, T, uint)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionXorUnsignedInteger_WithContention_SavesProperResult ()
+        {
+            const uint xorValue = 0x8000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionXor(ref _testContentionUnsignedInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, xorValue),
+                0, xorValue - 1, incrementValue => (incrementValue & xorValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | xorValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor(ref long, Predicate{long}, long)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionXorLongInteger_WithContention_SavesProperResult ()
+        {
+            const long xorValue = 0x4000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_LongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionXor(ref _testContentionLongInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, xorValue),
+                0, xorValue - 1, incrementValue => (incrementValue & xorValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | xorValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor{T}(ref long, Func{long, T, bool}, T, long)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionXorLongInteger_WithContention_SavesProperResult ()
+        {
+            const long xorValue = 0x4000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_LongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionXor(ref _testContentionLongInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, xorValue),
+                0, xorValue - 1, incrementValue => (incrementValue & xorValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | xorValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor(ref ulong, Predicate{ulong}, ulong)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ConditionXorUnsignedLongInteger_WithContention_SavesProperResult ()
+        {
+            const ulong xorValue = 0x8000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedLongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionXor(ref _testContentionUnsignedLongInteger,
+                        _ =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return true;
+                        }, xorValue),
+                0, xorValue - 1, incrementValue => (incrementValue & xorValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | xorValue);
+                });
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.ConditionXor{T}(ref ulong, Func{ulong, T, bool}, T, ulong)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_ArgumentConditionXorUnsignedLongInteger_WithContention_SavesProperResult ()
+        {
+            const ulong xorValue = 0x8000_0000_0000_0000;
+            int conditionRanCount = 0;
+            UsingInterlockedOps_UnsignedLongIntegerOperation_WithContention_SavesProperResult(() => conditionRanCount = 0,
+                () => InterlockedOps.ConditionXor(ref _testContentionUnsignedLongInteger,
+                        (_, returnValue) =>
+                        {
+                            // Track how many times the condition is checked.
+                            Interlocked.Increment(ref conditionRanCount);
+                            return returnValue;
+                        }, true, xorValue),
+                0, xorValue - 1, incrementValue => (incrementValue & xorValue) != 0,
+                (incrementValue, compareValue) =>
+                {
+                    conditionRanCount.Should().BeGreaterThan(0);
+                    incrementValue.Should().Be(compareValue | xorValue);
+                });
+        }
+        //--------------------------------------------------------------------------------    
+        #endregion Conditional Xor Tests
+    }
+    //################################################################################
+}
diff --git a/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_SetBits.cs b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_SetBits.cs
new file mode 100644
index 0000000..9ac12d6
--- /dev/null
+++ b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_SetBits.cs
@@ -0,0 +1,161 @@
+// Copyright (c) Kevin Zehrer
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+
+using FluentAssertions;
+
+namespace KZDev.PerfUtils.Tests
+{
+    //################################################################################
+    /// <summary>
+    /// Unit tests for the <see cref="InterlockedOps"/> SetBits operations.
+    /// </summary>
+    public partial class UsingInterlockedOps
+    {
+        #region SetBits Tests
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.SetBits(ref int, int)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_SetBitsInteger_SavesProperResult ()
+        {
+            int variable = GetTestInteger();
+
+            // Run the test a bunch of times
+            for (int loop = 0; loop < BitManagementTestLoopCount; loop++)
+            {
+                int originalValue = variable;
+                int operationValue = GetTestInteger();
+                (int operationOriginalValue, int newValue) = InterlockedOps.SetBits(ref variable, operationValue);
+                operationOriginalValue.Should().Be(originalValue);
+                variable.Should().Be(originalValue | operationValue);
+                newValue.Should().Be(variable);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.SetBits(ref uint, uint)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_SetBitsUnsignedInteger_SavesProperResult ()
+        {
+            uint variable = GetTestUnsignedInteger();
+
+            // Run the test a bunch of times
+            for (int loop = 0; loop < BitManagementTestLoopCount; loop++)
+            {
+                uint originalValue = variable;
+                uint operationValue = GetTestUnsignedInteger();
+                (uint operationOriginalValue, uint newValue) = InterlockedOps.SetBits(ref variable, operationValue);
+                operationOriginalValue.Should().Be(originalValue);
+                variable.Should().Be(originalValue | operationValue);
+                newValue.Should().Be(variable);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.SetBits(ref long, long)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_SetBitsLongInteger_SavesProperResult ()
+        {
+            long variable = GetTestLongInteger();
+
+            // Run the test a bunch of times
+            for (long loop = 0; loop < BitManagementTestLoopCount; loop++)
+            {
+                long originalValue = variable;
+                long operationValue = GetTestLongInteger();
+                (long operationOriginalValue, long newValue) = InterlockedOps.SetBits(ref variable, operationValue);
+                operationOriginalValue.Should().Be(originalValue);
+                variable.Should().Be(originalValue | operationValue);
+                newValue.Should().Be(variable);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.SetBits(ref ulong, ulong)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_SetBitsUnsignedLongInteger_SavesProperResult ()
+        {
+            ulong variable = GetTestUnsignedLongInteger();
+
+            // Run the test a bunch of times
+            for (long loop = 0; loop < BitManagementTestLoopCount; loop++)
+            {
+                ulong originalValue = variable;
+                ulong operationValue = GetTestUnsignedLongInteger();
+                (ulong operationOriginalValue, ulong newValue) = InterlockedOps.SetBits(ref variable, operationValue);
+                operationOriginalValue.Should().Be(originalValue);
+                variable.Should().Be(originalValue | operationValue);
+                newValue.Should().Be(variable);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.SetBits(ref int, int)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_SetBitsInteger_WithContention_SavesProperResult ()
+        {
+            const int setBitsValue = 0x4000_0000;
+            UsingInterlockedOps_IntegerOperation_WithContention_SavesProperResult(null, () =>
+                    InterlockedOps.SetBits(ref _testContentionInteger, setBitsValue),
+                0, setBitsValue - 1, incrementValue => (incrementValue & setBitsValue) != 0,
+                (incrementValue, compareValue) => incrementValue.Should().Be(compareValue | setBitsValue));
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.SetBits(ref uint, uint)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_SetBitsUnsignedInteger_WithContention_SavesProperResult ()
+        {
+            const uint setBitsValue = 0x8000_0000;
+            UsingInterlockedOps_UnsignedIntegerOperation_WithContention_SavesProperResult(null, () =>
+                    InterlockedOps.SetBits(ref _testContentionUnsignedInteger, setBitsValue),
+                0, setBitsValue - 1, incrementValue => (incrementValue & setBitsValue) != 0,
+                (incrementValue, compareValue) => incrementValue.Should().Be(compareValue | setBitsValue));
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.SetBits(ref long, long)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_SetBitsLongInteger_WithContention_SavesProperResult ()
+        {
+            const long setBitsValue = 0x4000_0000_0000_0000;
+            UsingInterlockedOps_LongIntegerOperation_WithContention_SavesProperResult(null, () =>
+                    InterlockedOps.SetBits(ref _testContentionLongInteger, setBitsValue),
+                0, setBitsValue - 1, incrementValue => (incrementValue & setBitsValue) != 0,
+                (incrementValue, compareValue) => incrementValue.Should().Be(compareValue | setBitsValue));
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.SetBits(ref ulong, ulong)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_SetBitsUnsignedLongInteger_WithContention_SavesProperResult ()
+        {
+            const ulong setBitsValue = 0x8000_0000_0000_0000;
+            UsingInterlockedOps_UnsignedLongIntegerOperation_WithContention_SavesProperResult(null, () =>
+                    InterlockedOps.SetBits(ref _testContentionUnsignedLongInteger, setBitsValue),
+                0, setBitsValue - 1, incrementValue => (incrementValue & setBitsValue) != 0,
+                (incrementValue, compareValue) => incrementValue.Should().Be(compareValue | setBitsValue));
+        }
+        //--------------------------------------------------------------------------------    
+
+        #endregion SetBits Tests
+    }
+    //################################################################################
+}
diff --git a/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_Xor.cs b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_Xor.cs
new file mode 100644
index 0000000..2196bca
--- /dev/null
+++ b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps_Xor.cs
@@ -0,0 +1,157 @@
+// Copyright (c) Kevin Zehrer
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+
+using FluentAssertions;
+
+namespace KZDev.PerfUtils.Tests
+{
+    //################################################################################
+    /// <summary>
+    /// Unit tests for the <see cref="InterlockedOps"/> Xor operations.
+    /// </summary>
+    public partial class UsingInterlockedOps
+    {
+        #region Xor Tests
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.Xor(ref int, int)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_XorInteger_SavesProperResult ()
+        {
+            int variable = GetTestInteger();
+
+            // Run the test a bunch of times
+            for (int loop = 0; loop < 1_000_000; loop++)
+            {
+                int originalValue = variable;
+                int operationValue = GetTestInteger();
+                int result = InterlockedOps.Xor(ref variable, operationValue);
+                result.Should().Be(originalValue);
+                variable.Should().Be(originalValue ^ operationValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.Xor(ref uint, uint)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_XorUnsignedInteger_SavesProperResult ()
+        {
+            uint variable = GetTestUnsignedInteger();
+
+            // Run the test a bunch of times
+            for (int loop = 0; loop < 1_000_000; loop++)
+            {
+                uint originalValue = variable;
+                uint operationValue = GetTestUnsignedInteger();
+                uint result = InterlockedOps.Xor(ref variable, operationValue);
+                result.Should().Be(originalValue);
+                variable.Should().Be(originalValue ^ operationValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.Xor(ref long, long)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_XorLongInteger_SavesProperResult ()
+        {
+            long variable = GetTestLongInteger();
+
+            // Run the test a bunch of times
+            for (long loop = 0; loop < 1_000_000; loop++)
+            {
+                long originalValue = variable;
+                long operationValue = GetTestLongInteger();
+                long result = InterlockedOps.Xor(ref variable, operationValue);
+                result.Should().Be(originalValue);
+                variable.Should().Be(originalValue ^ operationValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.Xor(ref ulong, ulong)"/> method with no contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_XorUnsignedLongInteger_SavesProperResult ()
+        {
+            ulong variable = GetTestUnsignedLongInteger();
+
+            // Run the test a bunch of times
+            for (long loop = 0; loop < 1_000_000; loop++)
+            {
+                ulong originalValue = variable;
+                ulong operationValue = GetTestUnsignedLongInteger();
+                ulong result = InterlockedOps.Xor(ref variable, operationValue);
+                result.Should().Be(originalValue);
+                variable.Should().Be(originalValue ^ operationValue);
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.Xor(ref int, int)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_XorInteger_WithContention_SavesProperResult ()
+        {
+            const int xorValue = 0x4000_0000;
+            UsingInterlockedOps_IntegerOperation_WithContention_SavesProperResult(null, () =>
+                    InterlockedOps.Xor(ref _testContentionInteger, xorValue),
+                0, xorValue - 1, incrementValue => (incrementValue & xorValue) != 0,
+                (incrementValue, compareValue) => incrementValue.Should().Be(compareValue | xorValue));
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.Xor(ref uint, uint)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_XorUnsignedInteger_WithContention_SavesProperResult ()
+        {
+            const uint xorValue = 0x8000_0000;
+            UsingInterlockedOps_UnsignedIntegerOperation_WithContention_SavesProperResult(null, () =>
+                    InterlockedOps.Xor(ref _testContentionUnsignedInteger, xorValue),
+                0, xorValue - 1, incrementValue => (incrementValue & xorValue) != 0,
+                (incrementValue, compareValue) => incrementValue.Should().Be(compareValue | xorValue));
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.Xor(ref long, long)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_XorLongInteger_WithContention_SavesProperResult ()
+        {
+            const long xorValue = 0x4000_0000_0000_0000;
+            UsingInterlockedOps_LongIntegerOperation_WithContention_SavesProperResult(null, () =>
+                    InterlockedOps.Xor(ref _testContentionLongInteger, xorValue),
+                0, xorValue - 1, incrementValue => (incrementValue & xorValue) != 0,
+                (incrementValue, compareValue) => incrementValue.Should().Be(compareValue | xorValue));
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests the <see cref="InterlockedOps.Xor(ref ulong, ulong)"/> method with contention
+        /// and variety of values.
+        /// </summary>
+        [Fact]
+        public void UsingInterlockedOps_XorUnsignedLongInteger_WithContention_SavesProperResult ()
+        {
+            const ulong xorValue = 0x8000_0000_0000_0000;
+            UsingInterlockedOps_UnsignedLongIntegerOperation_WithContention_SavesProperResult(null, () =>
+                    InterlockedOps.Xor(ref _testContentionUnsignedLongInteger, xorValue),
+                0, xorValue - 1, incrementValue => (incrementValue & xorValue) != 0,
+                (incrementValue, compareValue) => incrementValue.Should().Be(compareValue | xorValue));
+        }
+        //--------------------------------------------------------------------------------    
+
+        #endregion Xor Tests
+    }
+    //################################################################################
+}
diff --git a/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps`.cs b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps`.cs
new file mode 100644
index 0000000..21446e5
--- /dev/null
+++ b/Source/Tst/KZDev.PerfUtils.Concurrency.UnitTests/UsingInterlockedOps`.cs
@@ -0,0 +1,764 @@
+using System.Runtime.ExceptionServices;
+
+using FluentAssertions;
+
+namespace KZDev.PerfUtils.Tests
+{
+    /*
+     * While it would be really nice to simplify these methods into a single generic taking
+     * the different integer types, the CLR/BCL support to do that is not available until
+     * .NET 7, and we are supporting earlier versions, so we have a lot of duplicate code
+     * here
+     */
+
+    //################################################################################
+    /// <summary>
+    /// Internal helpers for unit tests for the <see cref="InterlockedOps"/> class.
+    /// </summary>
+    public partial class UsingInterlockedOps
+    {
+        /// <summary>
+        /// The number of increment loops will pass between each check for a caught exception
+        /// </summary>
+        private const int IncrementLoopExceptionCountFrequency = 1_000_000;
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests a simple <see cref="int"/> operation on <see cref="InterlockedOps"/> with contention
+        /// and variety of values.
+        /// </summary>
+        /// <param name="loopInitializer">
+        /// An optional callback that is executed before each test loop.
+        /// </param>
+        /// <param name="operation">
+        /// The operation to run in the 'test operation' thread.
+        /// </param>
+        /// <param name="startValue">
+        /// The starting value for the 'increment' thread loop.
+        /// </param>
+        /// <param name="maxIncrement">
+        /// The maximum increment value for the 'increment' thread loop.
+        /// </param>
+        /// <param name="operationRunCheckCondition">
+        /// The condition to check for the operation run.
+        /// </param>
+        /// <param name="operationRunVerifier">
+        /// The verifier to run when the operation is found to have run.
+        /// </param>
+        private void UsingInterlockedOps_IntegerOperation_WithContention_SavesProperResult
+            (Action? loopInitializer, Action operation, int startValue, int maxIncrement, 
+            Predicate<int> operationRunCheckCondition, Action<int, int> operationRunVerifier)
+        {
+            TimeSpan testCycleWaitTime = TimeSpan.FromSeconds(3);
+            // A signal to the test threads that they should abort
+            ManualResetEventSlim abortSignal = new ManualResetEventSlim(false);
+            // A signal to the increment value test thread that it should run
+            ManualResetEventSlim runIncrementSignal = new ManualResetEventSlim(false);
+            // A signal to the bit operation value test thread that it should run
+            ManualResetEventSlim runTestSignal = new ManualResetEventSlim(false);
+            // A signal for resetting the tests for the next loop.
+            ManualResetEventSlim resetSignal = new ManualResetEventSlim(false);
+            // A signal for the increment test to indicate it is done
+            ManualResetEventSlim incrementTestDoneSignal = new ManualResetEventSlim(false);
+            // Capture any exceptions that occur in the test threads
+            ExceptionDispatchInfo? exceptionDispatchInfo = null;
+
+            // The value containing the bit we will use to test for contention
+            List<double> hitLoopCounts = new(ContentionTestLoopCount);
+
+            // Set up two threads to run the test
+            Thread interlockedOperation = new Thread(InterlockedOperationThreadRun)
+            {
+                // We want the bit operation thread to run at a lower priority than the increment thread to cause
+                // possible context switching during the bit operation, but it should succeed at some point.
+                Priority = ThreadPriority.Lowest,
+                Name = "Operation Thread",
+                IsBackground = true
+            };
+            interlockedOperation.Start();
+
+            // Set up a thread to increment the value repeatedly looking for a bit change
+            // in the high order bit
+            Thread incrementThread = new Thread(IncrementThreadRun)
+            {
+                IsBackground = true,
+                Name = "Increment Thread"
+            };
+            incrementThread.Start();
+
+            try
+            {
+                // Now, run the test a bunch of times
+                for (int loop = 0; loop < ContentionTestLoopCount; loop++)
+                {
+                    // Signal the increment thread to run
+                    runIncrementSignal.Set();
+                    // Wait for the increment thread to finish
+                    incrementTestDoneSignal.Wait(5000).Should().BeTrue();
+                    if (exceptionDispatchInfo is not null)
+                    {
+                        TestWriteLine($"Exception found on loop #{loop}");
+                        break;
+                    }
+
+                    incrementTestDoneSignal.Reset();
+                    // Don't set the test reset on the last loop because that might cause the
+                    // increment thread to reset the signal and test the state of the abort
+                    // signal before we have a chance to set it below in the finally block.
+                    if (loop < ContentionTestLoopCount - 1)
+                        resetSignal.Set();
+                }
+            }
+            finally
+            {
+                // Shut down the test threads
+                abortSignal.Set();
+                // Set the signals to run the threads so that they loop around to the abort signal
+                resetSignal.Set();
+                runIncrementSignal.Set();
+                runTestSignal.Set();
+                // Wait for the threads to finish
+                incrementThread.Join(5000).Should().BeTrue();
+                TestWriteLine($"Increment Thread Stopped");
+                interlockedOperation.Join(5000).Should().BeTrue();
+                TestWriteLine($"Operation Thread Stopped");
+            }
+
+            exceptionDispatchInfo?.Throw();
+            TestWriteLine($"Average hit loop count: {hitLoopCounts.Average()}");
+
+            void InterlockedOperationThreadRun ()
+            {
+                try
+                {
+                    while (!abortSignal.IsSet)
+                    {
+                        // Now, wait for the test signal
+                        if (!runTestSignal.Wait(testCycleWaitTime))
+                            throw new TimeoutException("Timed out waiting for the test signal");
+                        runTestSignal.Reset();
+                        operation();
+                    }
+                }
+                catch (Exception error)
+                {
+                    exceptionDispatchInfo ??= ExceptionDispatchInfo.Capture(error);
+                }
+            }
+
+            void IncrementThreadRun ()
+            {
+                try
+                {
+                    while (!abortSignal.IsSet)
+                    {
+                        // Now, wait for the test signal
+                        if (!runIncrementSignal.Wait(testCycleWaitTime))
+                            throw new TimeoutException("Timed out waiting for the test increment signal");
+                        runIncrementSignal.Reset();
+                        loopInitializer?.Invoke();
+
+                        Interlocked.Exchange(ref _testContentionInteger, startValue);
+                        int lastValue = _testContentionInteger;
+                        bool bitOperationFoundAsRun = false;
+                        // We will try incrementing the value a number of times
+                        for (int rangeLoop = 0; rangeLoop < 5; rangeLoop++)
+                        {
+                            // Go into a loop incrementing the value and checking if we ever see the
+                            // test check condition hit
+                            for (int incrementLoop = 0; incrementLoop < maxIncrement; incrementLoop++)
+                            {
+                                int value = Interlocked.Increment(ref _testContentionInteger);
+                                if (operationRunCheckCondition(value))
+                                {
+                                    // The test to check if the operation has run has a bit, check if we now have the correct value
+                                    operationRunVerifier(value, ++lastValue);
+                                    bitOperationFoundAsRun = true;
+                                    hitLoopCounts.Add(incrementLoop);
+                                    break;
+                                }
+                                // The value should be the last value plus the increment
+                                value.Should().Be(++lastValue);
+                                // Signal the bit operation test thread to run - wait for a few loops to signal this
+                                if (incrementLoop == 10)
+                                {
+                                    runTestSignal.Set();
+                                }
+                                if ((0 == incrementLoop % IncrementLoopExceptionCountFrequency) && (exceptionDispatchInfo is not null))
+                                {
+                                    break;
+                                }
+                            }
+                            if (bitOperationFoundAsRun)
+                                break;
+                            if (exceptionDispatchInfo is not null)
+                                break;
+                        }
+                        if (!bitOperationFoundAsRun)
+                            throw new InvalidOperationException("The bit operation was not found");
+                        incrementTestDoneSignal.Set();
+                        if (!resetSignal.Wait(testCycleWaitTime))
+                            throw new TimeoutException("Timed out waiting for the reset signal");
+                        resetSignal.Reset();
+                    }
+                }
+                catch (Exception error)
+                {
+                    exceptionDispatchInfo ??= ExceptionDispatchInfo.Capture(error);
+                    incrementTestDoneSignal.Set();
+                }
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests a simple <see cref="uint"/> operation on <see cref="InterlockedOps"/> with contention
+        /// and variety of values.
+        /// </summary>
+        /// <param name="loopInitializer">
+        /// An optional callback that is executed before each test loop.
+        /// </param>
+        /// <param name="operation">
+        /// The operation to run in the 'test operation' thread.
+        /// </param>
+        /// <param name="startValue">
+        /// The starting value for the 'increment' thread loop.
+        /// </param>
+        /// <param name="maxIncrement">
+        /// The maximum increment value for the 'increment' thread loop.
+        /// </param>
+        /// <param name="operationRunCheckCondition">
+        /// The condition to check for the operation run.
+        /// </param>
+        /// <param name="operationRunVerifier">
+        /// The verifier to run when the operation is found to have run.
+        /// </param>
+        private void UsingInterlockedOps_UnsignedIntegerOperation_WithContention_SavesProperResult
+            (Action? loopInitializer, Action operation, uint startValue, uint maxIncrement, 
+            Predicate<uint> operationRunCheckCondition, Action<uint, uint> operationRunVerifier)
+        {
+            TimeSpan testCycleWaitTime = TimeSpan.FromSeconds(3);
+            // A signal to the test threads that they should abort
+            ManualResetEventSlim abortSignal = new ManualResetEventSlim(false);
+            // A signal to the increment value test thread that it should run
+            ManualResetEventSlim runIncrementSignal = new ManualResetEventSlim(false);
+            // A signal to the bit operation value test thread that it should run
+            ManualResetEventSlim runTestSignal = new ManualResetEventSlim(false);
+            // A signal for resetting the tests for the next loop.
+            ManualResetEventSlim resetSignal = new ManualResetEventSlim(false);
+            // A signal for the increment test to indicate it is done
+            ManualResetEventSlim incrementTestDoneSignal = new ManualResetEventSlim(false);
+            // Capture any exceptions that occur in the test threads
+            ExceptionDispatchInfo? exceptionDispatchInfo = null;
+
+            // The value containing the bit we will use to test for contention
+            List<double> hitLoopCounts = new(ContentionTestLoopCount);
+
+            // Set up two threads to run the test
+            Thread interlockedOperation = new Thread(InterlockedOperationThreadRun)
+            {
+                // We want the bit operation thread to run at a lower priority than the increment thread to cause
+                // possible context switching during the bit operation, but it should succeed at some point.
+                Priority = ThreadPriority.Lowest,
+                Name = "Operation Thread",
+                IsBackground = true
+            };
+            interlockedOperation.Start();
+
+            // Set up a thread to increment the value repeatedly looking for a bit change
+            // in the high order bit
+            Thread incrementThread = new Thread(IncrementThreadRun)
+            {
+                IsBackground = true,
+                Name = "Increment Thread"
+            };
+            incrementThread.Start();
+
+            try
+            {
+                // Now, run the test a bunch of times
+                for (int loop = 0; loop < ContentionTestLoopCount; loop++)
+                {
+                    // Signal the increment thread to run
+                    runIncrementSignal.Set();
+                    // Wait for the increment thread to finish
+                    incrementTestDoneSignal.Wait(5000).Should().BeTrue();
+                    if (exceptionDispatchInfo is not null)
+                    {
+                        TestWriteLine($"Exception found on loop #{loop}");
+                        break;
+                    }
+
+                    incrementTestDoneSignal.Reset();
+                    // Don't set the test reset on the last loop because that might cause the
+                    // increment thread to reset the signal and test the state of the abort
+                    // signal before we have a chance to set it below in the finally block.
+                    if (loop < ContentionTestLoopCount - 1)
+                        resetSignal.Set();
+                }
+            }
+            finally
+            {
+                // Shut down the test threads
+                abortSignal.Set();
+                // Set the signals to run the threads so that they loop around to the abort signal
+                resetSignal.Set();
+                runIncrementSignal.Set();
+                runTestSignal.Set();
+                // Wait for the threads to finish
+                incrementThread.Join(5000).Should().BeTrue();
+                TestWriteLine($"Increment Thread Stopped");
+                interlockedOperation.Join(5000).Should().BeTrue();
+                TestWriteLine($"Operation Thread Stopped");
+            }
+
+            exceptionDispatchInfo?.Throw();
+            TestWriteLine($"Average hit loop count: {hitLoopCounts.Average()}");
+
+            void InterlockedOperationThreadRun ()
+            {
+                try
+                {
+                    while (!abortSignal.IsSet)
+                    {
+                        // Now, wait for the test signal
+                        if (!runTestSignal.Wait(testCycleWaitTime))
+                            throw new TimeoutException("Timed out waiting for the test signal");
+                        runTestSignal.Reset();
+                        operation();
+                    }
+                }
+                catch (Exception error)
+                {
+                    exceptionDispatchInfo ??= ExceptionDispatchInfo.Capture(error);
+                }
+            }
+
+            void IncrementThreadRun ()
+            {
+                try
+                {
+                    while (!abortSignal.IsSet)
+                    {
+                        // Now, wait for the test signal
+                        if (!runIncrementSignal.Wait(testCycleWaitTime))
+                            throw new TimeoutException("Timed out waiting for the test increment signal");
+                        runIncrementSignal.Reset();
+                        loopInitializer?.Invoke();
+
+                        Interlocked.Exchange(ref _testContentionUnsignedInteger, startValue);
+                        uint lastValue = _testContentionUnsignedInteger;
+                        bool bitOperationFoundAsRun = false;
+                        // We will try incrementing the value a number of times
+                        for (int rangeLoop = 0; rangeLoop < 5; rangeLoop++)
+                        {
+                            // Go into a loop incrementing the value and checking if we ever see the
+                            // test check condition hit
+                            for (int incrementLoop = 0; incrementLoop < maxIncrement; incrementLoop++)
+                            {
+                                uint value = Interlocked.Increment(ref _testContentionUnsignedInteger);
+                                if (operationRunCheckCondition(value))
+                                {
+                                    // The test to check if the operation has run has a bit, check if we now have the correct value
+                                    operationRunVerifier(value, ++lastValue);
+                                    bitOperationFoundAsRun = true;
+                                    hitLoopCounts.Add(incrementLoop);
+                                    break;
+                                }
+                                // The value should be the last value plus the increment
+                                value.Should().Be(++lastValue);
+                                // Signal the bit operation test thread to run - wait for a few loops to signal this
+                                if (incrementLoop == 10)
+                                {
+                                    runTestSignal.Set();
+                                }
+                                if ((0 == incrementLoop % IncrementLoopExceptionCountFrequency) && (exceptionDispatchInfo is not null))
+                                {
+                                    break;
+                                }
+                            }
+                            if (bitOperationFoundAsRun)
+                                break;
+                            if (exceptionDispatchInfo is not null)
+                                break;
+                        }
+                        if (!bitOperationFoundAsRun)
+                            throw new InvalidOperationException("The bit operation was not found");
+                        incrementTestDoneSignal.Set();
+                        if (!resetSignal.Wait(testCycleWaitTime))
+                            throw new TimeoutException("Timed out waiting for the reset signal");
+                        resetSignal.Reset();
+                    }
+                }
+                catch (Exception error)
+                {
+                    exceptionDispatchInfo ??= ExceptionDispatchInfo.Capture(error);
+                    incrementTestDoneSignal.Set();
+                }
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests a simple <see cref="long"/> operation on <see cref="InterlockedOps"/> with contention
+        /// and variety of values.
+        /// </summary>
+        /// <param name="loopInitializer">
+        /// An optional callback that is executed before each test loop.
+        /// </param>
+        /// <param name="operation">
+        /// The operation to run in the 'test operation' thread.
+        /// </param>
+        /// <param name="startValue">
+        /// The starting value for the 'increment' thread loop.
+        /// </param>
+        /// <param name="maxIncrement">
+        /// The maximum increment value for the 'increment' thread loop.
+        /// </param>
+        /// <param name="operationRunCheckCondition">
+        /// The condition to check for the operation run.
+        /// </param>
+        /// <param name="operationRunVerifier">
+        /// The verifier to run when the operation is found to have run.
+        /// </param>
+        private void UsingInterlockedOps_LongIntegerOperation_WithContention_SavesProperResult
+            (Action? loopInitializer, Action operation, long startValue, long maxIncrement, 
+            Predicate<long> operationRunCheckCondition, Action<long, long> operationRunVerifier)
+        {
+            TimeSpan testCycleWaitTime = TimeSpan.FromSeconds(3);
+            // A signal to the test threads that they should abort
+            ManualResetEventSlim abortSignal = new ManualResetEventSlim(false);
+            // A signal to the increment value test thread that it should run
+            ManualResetEventSlim runIncrementSignal = new ManualResetEventSlim(false);
+            // A signal to the bit operation value test thread that it should run
+            ManualResetEventSlim runTestSignal = new ManualResetEventSlim(false);
+            // A signal for resetting the tests for the next loop.
+            ManualResetEventSlim resetSignal = new ManualResetEventSlim(false);
+            // A signal for the increment test to indicate it is done
+            ManualResetEventSlim incrementTestDoneSignal = new ManualResetEventSlim(false);
+            // Capture any exceptions that occur in the test threads
+            ExceptionDispatchInfo? exceptionDispatchInfo = null;
+
+            // The value containing the bit we will use to test for contention
+            List<double> hitLoopCounts = new(ContentionTestLoopCount);
+
+            // Set up two threads to run the test
+            Thread interlockedOperation = new Thread(InterlockedOperationThreadRun)
+            {
+                // We want the bit operation thread to run at a lower priority than the increment thread to cause
+                // possible context switching during the bit operation, but it should succeed at some point.
+                Priority = ThreadPriority.Lowest,
+                Name = "Operation Thread",
+                IsBackground = true
+            };
+            interlockedOperation.Start();
+
+            // Set up a thread to increment the value repeatedly looking for a bit change
+            // in the high order bit
+            Thread incrementThread = new Thread(IncrementThreadRun)
+            {
+                IsBackground = true,
+                Name = "Increment Thread"
+            };
+            incrementThread.Start();
+
+            try
+            {
+                // Now, run the test a bunch of times
+                for (long loop = 0; loop < ContentionTestLoopCount; loop++)
+                {
+                    // Signal the increment thread to run
+                    runIncrementSignal.Set();
+                    // Wait for the increment thread to finish
+                    incrementTestDoneSignal.Wait(5000).Should().BeTrue();
+                    if (exceptionDispatchInfo is not null)
+                    {
+                        TestWriteLine($"Exception found on loop #{loop}");
+                        break;
+                    }
+
+                    incrementTestDoneSignal.Reset();
+                    // Don't set the test reset on the last loop because that might cause the
+                    // increment thread to reset the signal and test the state of the abort
+                    // signal before we have a chance to set it below in the finally block.
+                    if (loop < ContentionTestLoopCount - 1)
+                        resetSignal.Set();
+                }
+            }
+            finally
+            {
+                // Shut down the test threads
+                abortSignal.Set();
+                // Set the signals to run the threads so that they loop around to the abort signal
+                resetSignal.Set();
+                runIncrementSignal.Set();
+                runTestSignal.Set();
+                // Wait for the threads to finish
+                incrementThread.Join(5000).Should().BeTrue();
+                TestWriteLine($"Increment Thread Stopped");
+                interlockedOperation.Join(5000).Should().BeTrue();
+                TestWriteLine($"Operation Thread Stopped");
+            }
+
+            exceptionDispatchInfo?.Throw();
+            TestWriteLine($"Average hit loop count: {hitLoopCounts.Average()}");
+
+            void InterlockedOperationThreadRun ()
+            {
+                try
+                {
+                    while (!abortSignal.IsSet)
+                    {
+                        // Now, wait for the test signal
+                        if (!runTestSignal.Wait(testCycleWaitTime))
+                            throw new TimeoutException("Timed out waiting for the test signal");
+                        runTestSignal.Reset();
+                        operation();
+                    }
+                }
+                catch (Exception error)
+                {
+                    exceptionDispatchInfo ??= ExceptionDispatchInfo.Capture(error);
+                }
+            }
+
+            void IncrementThreadRun ()
+            {
+                try
+                {
+                    while (!abortSignal.IsSet)
+                    {
+                        // Now, wait for the test signal
+                        if (!runIncrementSignal.Wait(testCycleWaitTime))
+                            throw new TimeoutException("Timed out waiting for the test increment signal");
+                        runIncrementSignal.Reset();
+                        loopInitializer?.Invoke();
+
+                        Interlocked.Exchange(ref _testContentionLongInteger, startValue);
+                        long lastValue = _testContentionLongInteger;
+                        bool bitOperationFoundAsRun = false;
+                        // Go into a loop incrementing the value and checking if we ever see the
+                        // test check condition hit
+                        for (long incrementLoop = 0; incrementLoop < maxIncrement; incrementLoop++)
+                        {
+                            long value = Interlocked.Increment(ref _testContentionLongInteger);
+                            if (operationRunCheckCondition(value))
+                            {
+                                // The test to check if the operation has run has a bit, check if we now have the correct value
+                                operationRunVerifier(value, ++lastValue);
+                                bitOperationFoundAsRun = true;
+                                hitLoopCounts.Add(incrementLoop);
+                                break;
+                            }
+                            // The value should be the last value plus the increment
+                            value.Should().Be(++lastValue);
+                            // Signal the bit operation test thread to run - wait for a few loops to signal this
+                            if (incrementLoop == 10)
+                            {
+                                runTestSignal.Set();
+                            }
+                            if ((0 == incrementLoop % IncrementLoopExceptionCountFrequency) && (exceptionDispatchInfo is not null))
+                            {
+                                break;
+                            }
+                        }
+                        if (exceptionDispatchInfo is not null)
+                            break;
+                        if (!bitOperationFoundAsRun)
+                            throw new InvalidOperationException("The bit operation was not found");
+                        incrementTestDoneSignal.Set();
+                        if (!resetSignal.Wait(testCycleWaitTime))
+                            throw new TimeoutException("Timed out waiting for the reset signal");
+                        resetSignal.Reset();
+                    }
+                }
+                catch (Exception error)
+                {
+                    exceptionDispatchInfo ??= ExceptionDispatchInfo.Capture(error);
+                    incrementTestDoneSignal.Set();
+                }
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Tests a simple <see cref="ulong"/> operation on <see cref="InterlockedOps"/> with contention
+        /// and variety of values.
+        /// </summary>
+        /// <param name="loopInitializer">
+        /// An optional callback that is executed before each test loop.
+        /// </param>
+        /// <param name="operation">
+        /// The operation to run in the 'test operation' thread.
+        /// </param>
+        /// <param name="startValue">
+        /// The starting value for the 'increment' thread loop.
+        /// </param>
+        /// <param name="maxIncrement">
+        /// The maximum increment value for the 'increment' thread loop.
+        /// </param>
+        /// <param name="operationRunCheckCondition">
+        /// The condition to check for the operation run.
+        /// </param>
+        /// <param name="operationRunVerifier">
+        /// The verifier to run when the operation is found to have run.
+        /// </param>
+        private void UsingInterlockedOps_UnsignedLongIntegerOperation_WithContention_SavesProperResult
+            (Action? loopInitializer, Action operation, ulong startValue, ulong maxIncrement, 
+            Predicate<ulong> operationRunCheckCondition, Action<ulong, ulong> operationRunVerifier)
+        {
+            TimeSpan testCycleWaitTime = TimeSpan.FromSeconds(3);
+            // A signal to the test threads that they should abort
+            ManualResetEventSlim abortSignal = new ManualResetEventSlim(false);
+            // A signal to the increment value test thread that it should run
+            ManualResetEventSlim runIncrementSignal = new ManualResetEventSlim(false);
+            // A signal to the bit operation value test thread that it should run
+            ManualResetEventSlim runTestSignal = new ManualResetEventSlim(false);
+            // A signal for resetting the tests for the next loop.
+            ManualResetEventSlim resetSignal = new ManualResetEventSlim(false);
+            // A signal for the increment test to indicate it is done
+            ManualResetEventSlim incrementTestDoneSignal = new ManualResetEventSlim(false);
+            // Capture any exceptions that occur in the test threads
+            ExceptionDispatchInfo? exceptionDispatchInfo = null;
+
+            // The value containing the bit we will use to test for contention
+            List<double> hitLoopCounts = new(ContentionTestLoopCount);
+
+            // Set up two threads to run the test
+            Thread interlockedOperation = new Thread(InterlockedOperationThreadRun)
+            {
+                // We want the bit operation thread to run at a lower priority than the increment thread to cause
+                // possible context switching during the bit operation, but it should succeed at some point.
+                Priority = ThreadPriority.Lowest,
+                Name = "Operation Thread",
+                IsBackground = true
+            };
+            interlockedOperation.Start();
+
+            // Set up a thread to increment the value repeatedly looking for a bit change
+            // in the high order bit
+            Thread incrementThread = new Thread(IncrementThreadRun)
+            {
+                IsBackground = true,
+                Name = "Increment Thread"
+            };
+            incrementThread.Start();
+
+            try
+            {
+                // Now, run the test a bunch of times
+                for (long loop = 0; loop < ContentionTestLoopCount; loop++)
+                {
+                    // Signal the increment thread to run
+                    runIncrementSignal.Set();
+                    // Wait for the increment thread to finish
+                    incrementTestDoneSignal.Wait(5000).Should().BeTrue();
+                    if (exceptionDispatchInfo is not null)
+                    {
+                        TestWriteLine($"Exception found on loop #{loop}");
+                        break;
+                    }
+
+                    incrementTestDoneSignal.Reset();
+                    // Don't set the test reset on the last loop because that might cause the
+                    // increment thread to reset the signal and test the state of the abort
+                    // signal before we have a chance to set it below in the finally block.
+                    if (loop < ContentionTestLoopCount - 1)
+                        resetSignal.Set();
+                }
+            }
+            finally
+            {
+                // Shut down the test threads
+                abortSignal.Set();
+                // Set the signals to run the threads so that they loop around to the abort signal
+                resetSignal.Set();
+                runIncrementSignal.Set();
+                runTestSignal.Set();
+                // Wait for the threads to finish
+                incrementThread.Join(5000).Should().BeTrue();
+                TestWriteLine($"Increment Thread Stopped");
+                interlockedOperation.Join(5000).Should().BeTrue();
+                TestWriteLine($"Operation Thread Stopped");
+            }
+
+            exceptionDispatchInfo?.Throw();
+            TestWriteLine($"Average hit loop count: {hitLoopCounts.Average()}");
+
+            void InterlockedOperationThreadRun ()
+            {
+                try
+                {
+                    while (!abortSignal.IsSet)
+                    {
+                        // Now, wait for the test signal
+                        if (!runTestSignal.Wait(testCycleWaitTime))
+                            throw new TimeoutException("Timed out waiting for the test signal");
+                        runTestSignal.Reset();
+                        operation();
+                    }
+                }
+                catch (Exception error)
+                {
+                    exceptionDispatchInfo ??= ExceptionDispatchInfo.Capture(error);
+                }
+            }
+
+            void IncrementThreadRun ()
+            {
+                try
+                {
+                    while (!abortSignal.IsSet)
+                    {
+                        // Now, wait for the test signal
+                        if (!runIncrementSignal.Wait(testCycleWaitTime))
+                            throw new TimeoutException("Timed out waiting for the test increment signal");
+                        runIncrementSignal.Reset();
+                        loopInitializer?.Invoke();
+
+                        Interlocked.Exchange(ref _testContentionUnsignedLongInteger, startValue);
+                        ulong lastValue = _testContentionUnsignedLongInteger;
+                        bool bitOperationFoundAsRun = false;
+                        // Go into a loop incrementing the value and checking if we ever see the
+                        // test check condition hit
+                        for (ulong incrementLoop = 0; incrementLoop < maxIncrement; incrementLoop++)
+                        {
+                            ulong value = Interlocked.Increment(ref _testContentionUnsignedLongInteger);
+                            if (operationRunCheckCondition(value))
+                            {
+                                // The test to check if the operation has run has a bit, check if we now have the correct value
+                                operationRunVerifier(value, ++lastValue);
+                                bitOperationFoundAsRun = true;
+                                hitLoopCounts.Add(incrementLoop);
+                                break;
+                            }
+                            // The value should be the last value plus the increment
+                            value.Should().Be(++lastValue);
+                            // Signal the bit operation test thread to run - wait for a few loops to signal this
+                            if (incrementLoop == 10)
+                            {
+                                runTestSignal.Set();
+                            }
+                            if ((0 == incrementLoop % IncrementLoopExceptionCountFrequency) && (exceptionDispatchInfo is not null))
+                            {
+                                break;
+                            }
+                        }
+                        if (exceptionDispatchInfo is not null)
+                            break;
+                        if (!bitOperationFoundAsRun)
+                            throw new InvalidOperationException("The bit operation was not found");
+                        incrementTestDoneSignal.Set();
+                        if (!resetSignal.Wait(testCycleWaitTime))
+                            throw new TimeoutException("Timed out waiting for the reset signal");
+                        resetSignal.Reset();
+                    }
+                }
+                catch (Exception error)
+                {
+                    exceptionDispatchInfo ??= ExceptionDispatchInfo.Capture(error);
+                    incrementTestDoneSignal.Set();
+                }
+            }
+        }
+        //--------------------------------------------------------------------------------    
+    }
+    //################################################################################
+}
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Fixed.UnitTests/KZDev.PerfUtils.Memory.Fixed.UnitTests.csproj b/Source/Tst/KZDev.PerfUtils.Memory.Fixed.UnitTests/KZDev.PerfUtils.Memory.Fixed.UnitTests.csproj
index 04e891f..faf68b5 100644
--- a/Source/Tst/KZDev.PerfUtils.Memory.Fixed.UnitTests/KZDev.PerfUtils.Memory.Fixed.UnitTests.csproj
+++ b/Source/Tst/KZDev.PerfUtils.Memory.Fixed.UnitTests/KZDev.PerfUtils.Memory.Fixed.UnitTests.csproj
@@ -5,9 +5,9 @@
 	</PropertyGroup>
 
 	<ItemGroup>
-		<PackageReference Include="coverlet.collector" Version="6.0.2" />
-		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
-		<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
+		<PackageReference Include="coverlet.collector" Version="$(PerfUtils-Pkg-coverlet_collector)" />
+		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(PerfUtils-Pkg-Microsoft_NET_Test_Sdk)" />
+		<PackageReference Include="xunit.runner.visualstudio" Version="$(PerfUtils-Pkg-xunit_runner_visualstudio)" />
 	</ItemGroup>
 
 	<ItemGroup>
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Fixed.UnitTests/UsingMemoryStreamSlim.cs b/Source/Tst/KZDev.PerfUtils.Memory.Fixed.UnitTests/UsingMemoryStreamSlim.cs
index b853d79..5b22a89 100644
--- a/Source/Tst/KZDev.PerfUtils.Memory.Fixed.UnitTests/UsingMemoryStreamSlim.cs
+++ b/Source/Tst/KZDev.PerfUtils.Memory.Fixed.UnitTests/UsingMemoryStreamSlim.cs
@@ -13,7 +13,7 @@ namespace KZDev.PerfUtils.Tests
     /// is created with a buffer that is already allocated.
     /// </summary>
     [Trait(TestConstants.TestTrait.Category, "Memory")]
-    public partial class UsingMemoryStreamSlim : UnitTestBase
+    public partial class UsingMemoryStreamSlim : UsingMemoryStreamSlimUnitTestBase
     {
         //--------------------------------------------------------------------------------
         /// <summary>
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests.csproj b/Source/Tst/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests.csproj
index 76f992f..15573e9 100644
--- a/Source/Tst/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests.csproj
+++ b/Source/Tst/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests.csproj
@@ -5,9 +5,9 @@
 	</PropertyGroup>
 
 	<ItemGroup>
-		<PackageReference Include="coverlet.collector" Version="6.0.2" />
-		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
-		<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
+		<PackageReference Include="coverlet.collector" Version="$(PerfUtils-Pkg-coverlet_collector)" />
+		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(PerfUtils-Pkg-Microsoft_NET_Test_Sdk)" />
+		<PackageReference Include="xunit.runner.visualstudio" Version="$(PerfUtils-Pkg-xunit_runner_visualstudio)" />
 	</ItemGroup>
 
 	<ItemGroup>
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests/UsingMemoryStreamSlim.cs b/Source/Tst/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests/UsingMemoryStreamSlimReleaseBuffers.cs
similarity index 86%
rename from Source/Tst/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests/UsingMemoryStreamSlim.cs
rename to Source/Tst/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests/UsingMemoryStreamSlimReleaseBuffers.cs
index 4b08897..b41b827 100644
--- a/Source/Tst/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests/UsingMemoryStreamSlim.cs
+++ b/Source/Tst/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests/UsingMemoryStreamSlimReleaseBuffers.cs
@@ -1,9 +1,10 @@
 // Copyright (c) Kevin Zehrer
 // Licensed under the MIT License. See LICENSE file in the project root for full license information.
 
-using FluentAssertions;
 using System.Runtime;
 
+using FluentAssertions;
+
 using Xunit.Abstractions;
 
 namespace KZDev.PerfUtils.Tests
@@ -14,17 +15,8 @@ namespace KZDev.PerfUtils.Tests
     /// parallel with other tests.
     /// </summary>
     [Trait(TestConstants.TestTrait.Category, "Memory")]
-    public partial class UsingMemoryStreamSlim : UnitTestBase
+    public class UsingMemoryStreamSlimReleaseBuffers : UsingMemoryStreamSlimUnitTestBase
     {
-        /// <summary>
-        /// The minimum number of test loops to run for the tests.
-        /// </summary>
-        private const int MinimumTestLoops = 100;
-        /// <summary>
-        /// The maximum number of test loops to run for the tests.
-        /// </summary>
-        private const int MaximumTestLoops = 500;
-
         //--------------------------------------------------------------------------------
         /// <summary>
         /// Initializes a new instance of the <see cref="UsingMemoryStreamSlim"/> class.
@@ -32,7 +24,7 @@ public partial class UsingMemoryStreamSlim : UnitTestBase
         /// <param name="xUnitTestOutputHelper">
         /// The Xunit test output helper that can be used to output test messages
         /// </param>
-        public UsingMemoryStreamSlim (ITestOutputHelper xUnitTestOutputHelper) : base(xUnitTestOutputHelper)
+        public UsingMemoryStreamSlimReleaseBuffers (ITestOutputHelper xUnitTestOutputHelper) : base(xUnitTestOutputHelper)
         {
         }
         //--------------------------------------------------------------------------------
@@ -46,8 +38,13 @@ public UsingMemoryStreamSlim (ITestOutputHelper xUnitTestOutputHelper) : base(xU
         /// Tests writing data to the stream and verifying that the contents of the other stream
         /// is identical to the data written.
         /// </summary>
+        /// <remarks>
+        /// Clearly this test is very specific to using GC Heap memory and would not apply
+        /// to using unmanaged memory, so this test is contained in the heap specific test
+        /// project.
+        /// </remarks>
         [Fact]
-        public void UsingMemoryStreamSlim_CopyFullToStream_SettingReleaseMemoryProperlyReleasesMemory ()
+        public void UsingMemoryStreamSlimReleaseBuffers_CopyFullToStream_SettingReleaseMemoryProperlyReleasesMemory ()
         {
             int[] testDataSizes = GenerateTestDataSizes(1000, 0xF_FFFF).ToArray();
 
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests/xunit.runner.json b/Source/Tst/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests/xunit.runner.json
index 1d2a02c..48b5e1d 100644
--- a/Source/Tst/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests/xunit.runner.json
+++ b/Source/Tst/KZDev.PerfUtils.Memory.Heap.Sequential.UnitTests/xunit.runner.json
@@ -1,5 +1,5 @@
 {
   "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json",
-  "parallelizeAssembly": true,
-  "parallelizeTestCollections" : true,
+  "parallelizeAssembly": false,
+  "parallelizeTestCollections": false
 }
\ No newline at end of file
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Heap.UnitTests/KZDev.PerfUtils.Memory.Heap.UnitTests.csproj b/Source/Tst/KZDev.PerfUtils.Memory.Heap.UnitTests/KZDev.PerfUtils.Memory.Heap.UnitTests.csproj
index 04e891f..faf68b5 100644
--- a/Source/Tst/KZDev.PerfUtils.Memory.Heap.UnitTests/KZDev.PerfUtils.Memory.Heap.UnitTests.csproj
+++ b/Source/Tst/KZDev.PerfUtils.Memory.Heap.UnitTests/KZDev.PerfUtils.Memory.Heap.UnitTests.csproj
@@ -5,9 +5,9 @@
 	</PropertyGroup>
 
 	<ItemGroup>
-		<PackageReference Include="coverlet.collector" Version="6.0.2" />
-		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
-		<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
+		<PackageReference Include="coverlet.collector" Version="$(PerfUtils-Pkg-coverlet_collector)" />
+		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(PerfUtils-Pkg-Microsoft_NET_Test_Sdk)" />
+		<PackageReference Include="xunit.runner.visualstudio" Version="$(PerfUtils-Pkg-xunit_runner_visualstudio)" />
 	</ItemGroup>
 
 	<ItemGroup>
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Heap.UnitTests/UsingMemoryStreamSlim.ReadWrite.cs b/Source/Tst/KZDev.PerfUtils.Memory.Heap.UnitTests/UsingMemoryStreamSlim.ReadWrite.cs
deleted file mode 100644
index 4caa336..0000000
--- a/Source/Tst/KZDev.PerfUtils.Memory.Heap.UnitTests/UsingMemoryStreamSlim.ReadWrite.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) Kevin Zehrer
-// Licensed under the MIT License. See LICENSE file in the project root for full license information.
-
-namespace KZDev.PerfUtils.Tests
-{
-    //################################################################################
-    /// <summary>
-    /// Unit tests for the <see cref="MemoryStreamSlim"/> class.
-    /// </summary>
-    public partial class UsingMemoryStreamSlim
-    {
-        /// <summary>
-        /// The minimum number of test loops to run for the tests.
-        /// </summary>
-        private const int MinimumTestLoops = 50;
-        /// <summary>
-        /// The maximum number of test loops to run for the tests.
-        /// </summary>
-        private const int MaximumTestLoops = 100;
-
-        /// <summary>
-        /// The minimum number of test loops to run for the random position tests.
-        /// </summary>
-        private const int MinimumRandomPositionTestLoops = 400;
-        /// <summary>
-        /// The maximum number of test loops to run for the random position tests.
-        /// </summary>
-        private const int MaximumRandomPositionTestLoops = 600;
-    }
-    //################################################################################
-}
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Heap.UnitTests/UsingMemoryStreamSlim.cs b/Source/Tst/KZDev.PerfUtils.Memory.Heap.UnitTests/UsingMemoryStreamSlim.cs
index b19be00..370155c 100644
--- a/Source/Tst/KZDev.PerfUtils.Memory.Heap.UnitTests/UsingMemoryStreamSlim.cs
+++ b/Source/Tst/KZDev.PerfUtils.Memory.Heap.UnitTests/UsingMemoryStreamSlim.cs
@@ -10,8 +10,25 @@ namespace KZDev.PerfUtils.Tests
     /// Unit tests for the <see cref="MemoryStreamSlim"/> class.
     /// </summary>
     [Trait(TestConstants.TestTrait.Category, "Memory")]
-    public partial class UsingMemoryStreamSlim : UnitTestBase
+    public partial class UsingMemoryStreamSlim : UsingMemoryStreamSlimUnitTestBase
     {
+        /// <summary>
+        /// The minimum number of test loops to run for the tests.
+        /// </summary>
+        private const int MinimumTestLoops = 50;
+        /// <summary>
+        /// The maximum number of test loops to run for the tests.
+        /// </summary>
+        private const int MaximumTestLoops = 100;
+
+        /// <summary>
+        /// The minimum number of test loops to run for the random position tests.
+        /// </summary>
+        private const int MinimumRandomPositionTestLoops = 400;
+        /// <summary>
+        /// The maximum number of test loops to run for the random position tests.
+        /// </summary>
+        private const int MaximumRandomPositionTestLoops = 600;
         //--------------------------------------------------------------------------------
         /// <summary>
         /// Initializes a new instance of the <see cref="UsingMemoryStreamSlim"/> class.
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Native.Sequential.UnitTests/KZDev.PerfUtils.Memory.Native.Sequential.UnitTests.csproj b/Source/Tst/KZDev.PerfUtils.Memory.Native.Sequential.UnitTests/KZDev.PerfUtils.Memory.Native.Sequential.UnitTests.csproj
index 3dda36a..80e8182 100644
--- a/Source/Tst/KZDev.PerfUtils.Memory.Native.Sequential.UnitTests/KZDev.PerfUtils.Memory.Native.Sequential.UnitTests.csproj
+++ b/Source/Tst/KZDev.PerfUtils.Memory.Native.Sequential.UnitTests/KZDev.PerfUtils.Memory.Native.Sequential.UnitTests.csproj
@@ -6,9 +6,9 @@
 	</PropertyGroup>
 
 	<ItemGroup>
-		<PackageReference Include="coverlet.collector" Version="6.0.2" />
-		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
-		<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
+		<PackageReference Include="coverlet.collector" Version="$(PerfUtils-Pkg-coverlet_collector)" />
+		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(PerfUtils-Pkg-Microsoft_NET_Test_Sdk)" />
+		<PackageReference Include="xunit.runner.visualstudio" Version="$(PerfUtils-Pkg-xunit_runner_visualstudio)" />
 	</ItemGroup>
 
 	<ItemGroup>
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Native.Sequential.UnitTests/UsingMemoryStreamSlim.cs b/Source/Tst/KZDev.PerfUtils.Memory.Native.Sequential.UnitTests/UsingMemoryStreamSlim.cs
deleted file mode 100644
index 7cd02ea..0000000
--- a/Source/Tst/KZDev.PerfUtils.Memory.Native.Sequential.UnitTests/UsingMemoryStreamSlim.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) Kevin Zehrer
-// Licensed under the MIT License. See LICENSE file in the project root for full license information.
-
-using Xunit.Abstractions;
-
-namespace KZDev.PerfUtils.Tests
-{
-    //################################################################################
-    /// <summary>
-    /// Unit tests for the <see cref="MemoryStreamSlim"/> class that never run in 
-    /// parallel with other tests.
-    /// </summary>
-    [Trait(TestConstants.TestTrait.Category, "Memory")]
-    public partial class UsingMemoryStreamSlim : UnitTestBase
-    {
-        /// <summary>
-        /// The minimum number of test loops to run for the tests.
-        /// </summary>
-        private const int MinimumTestLoops = 100;
-        /// <summary>
-        /// The maximum number of test loops to run for the tests.
-        /// </summary>
-        private const int MaximumTestLoops = 500;
-
-        //--------------------------------------------------------------------------------
-        /// <summary>
-        /// Initializes a new instance of the <see cref="UsingMemoryStreamSlim"/> class.
-        /// </summary>
-        /// <param name="xUnitTestOutputHelper">
-        /// The Xunit test output helper that can be used to output test messages
-        /// </param>
-        public UsingMemoryStreamSlim (ITestOutputHelper xUnitTestOutputHelper) : base(xUnitTestOutputHelper)
-        {
-        }
-        //--------------------------------------------------------------------------------
-    }
-    //################################################################################
-}
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Native.Sequential.UnitTests/xunit.runner.json b/Source/Tst/KZDev.PerfUtils.Memory.Native.Sequential.UnitTests/xunit.runner.json
index 1d2a02c..48b5e1d 100644
--- a/Source/Tst/KZDev.PerfUtils.Memory.Native.Sequential.UnitTests/xunit.runner.json
+++ b/Source/Tst/KZDev.PerfUtils.Memory.Native.Sequential.UnitTests/xunit.runner.json
@@ -1,5 +1,5 @@
 {
   "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json",
-  "parallelizeAssembly": true,
-  "parallelizeTestCollections" : true,
+  "parallelizeAssembly": false,
+  "parallelizeTestCollections": false
 }
\ No newline at end of file
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Native.UnitTests/KZDev.PerfUtils.Memory.Native.UnitTests.csproj b/Source/Tst/KZDev.PerfUtils.Memory.Native.UnitTests/KZDev.PerfUtils.Memory.Native.UnitTests.csproj
index a29ac31..0497f69 100644
--- a/Source/Tst/KZDev.PerfUtils.Memory.Native.UnitTests/KZDev.PerfUtils.Memory.Native.UnitTests.csproj
+++ b/Source/Tst/KZDev.PerfUtils.Memory.Native.UnitTests/KZDev.PerfUtils.Memory.Native.UnitTests.csproj
@@ -6,9 +6,9 @@
 	</PropertyGroup>
 
 	<ItemGroup>
-		<PackageReference Include="coverlet.collector" Version="6.0.2" />
-		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
-		<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
+		<PackageReference Include="coverlet.collector" Version="$(PerfUtils-Pkg-coverlet_collector)" />
+		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(PerfUtils-Pkg-Microsoft_NET_Test_Sdk)" />
+		<PackageReference Include="xunit.runner.visualstudio" Version="$(PerfUtils-Pkg-xunit_runner_visualstudio)" />
 	</ItemGroup>
 
 	<ItemGroup>
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Native.UnitTests/UsingMemoryStreamSlim.ReadWrite.cs b/Source/Tst/KZDev.PerfUtils.Memory.Native.UnitTests/UsingMemoryStreamSlim.ReadWrite.cs
deleted file mode 100644
index 4caa336..0000000
--- a/Source/Tst/KZDev.PerfUtils.Memory.Native.UnitTests/UsingMemoryStreamSlim.ReadWrite.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) Kevin Zehrer
-// Licensed under the MIT License. See LICENSE file in the project root for full license information.
-
-namespace KZDev.PerfUtils.Tests
-{
-    //################################################################################
-    /// <summary>
-    /// Unit tests for the <see cref="MemoryStreamSlim"/> class.
-    /// </summary>
-    public partial class UsingMemoryStreamSlim
-    {
-        /// <summary>
-        /// The minimum number of test loops to run for the tests.
-        /// </summary>
-        private const int MinimumTestLoops = 50;
-        /// <summary>
-        /// The maximum number of test loops to run for the tests.
-        /// </summary>
-        private const int MaximumTestLoops = 100;
-
-        /// <summary>
-        /// The minimum number of test loops to run for the random position tests.
-        /// </summary>
-        private const int MinimumRandomPositionTestLoops = 400;
-        /// <summary>
-        /// The maximum number of test loops to run for the random position tests.
-        /// </summary>
-        private const int MaximumRandomPositionTestLoops = 600;
-    }
-    //################################################################################
-}
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Native.UnitTests/UsingMemoryStreamSlim.cs b/Source/Tst/KZDev.PerfUtils.Memory.Native.UnitTests/UsingMemoryStreamSlim.cs
index b19be00..370155c 100644
--- a/Source/Tst/KZDev.PerfUtils.Memory.Native.UnitTests/UsingMemoryStreamSlim.cs
+++ b/Source/Tst/KZDev.PerfUtils.Memory.Native.UnitTests/UsingMemoryStreamSlim.cs
@@ -10,8 +10,25 @@ namespace KZDev.PerfUtils.Tests
     /// Unit tests for the <see cref="MemoryStreamSlim"/> class.
     /// </summary>
     [Trait(TestConstants.TestTrait.Category, "Memory")]
-    public partial class UsingMemoryStreamSlim : UnitTestBase
+    public partial class UsingMemoryStreamSlim : UsingMemoryStreamSlimUnitTestBase
     {
+        /// <summary>
+        /// The minimum number of test loops to run for the tests.
+        /// </summary>
+        private const int MinimumTestLoops = 50;
+        /// <summary>
+        /// The maximum number of test loops to run for the tests.
+        /// </summary>
+        private const int MaximumTestLoops = 100;
+
+        /// <summary>
+        /// The minimum number of test loops to run for the random position tests.
+        /// </summary>
+        private const int MinimumRandomPositionTestLoops = 400;
+        /// <summary>
+        /// The maximum number of test loops to run for the random position tests.
+        /// </summary>
+        private const int MaximumRandomPositionTestLoops = 600;
         //--------------------------------------------------------------------------------
         /// <summary>
         /// Initializes a new instance of the <see cref="UsingMemoryStreamSlim"/> class.
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Sequential.UnitTests/KZDev.PerfUtils.Memory.Sequential.UnitTests.csproj b/Source/Tst/KZDev.PerfUtils.Memory.Sequential.UnitTests/KZDev.PerfUtils.Memory.Sequential.UnitTests.csproj
deleted file mode 100644
index a1cd534..0000000
--- a/Source/Tst/KZDev.PerfUtils.Memory.Sequential.UnitTests/KZDev.PerfUtils.Memory.Sequential.UnitTests.csproj
+++ /dev/null
@@ -1,34 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-	<PropertyGroup>
-		<IsTestProject>true</IsTestProject>
-	</PropertyGroup>
-
-	<ItemGroup>
-		<PackageReference Include="coverlet.collector" Version="6.0.2" />
-		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
-		<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
-	</ItemGroup>
-
-	<ItemGroup>
-		<ProjectReference Include="..\..\Src\KZDev.PerfUtils\KZDev.PerfUtils.csproj" />
-		<ProjectReference Include="..\KZDev.PerfUtils.UnitTestBase\KZDev.PerfUtils.UnitTestBase.csproj" />
-	</ItemGroup>
-
-	<ItemGroup>
-		<AssemblyAttribute Include="System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage" />
-	</ItemGroup>
-
-	<ItemGroup>
-		<Using Include="Xunit" />
-	</ItemGroup>
-
-	<ItemGroup>
-		<Content Include="xunit.runner.json">
-			<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-		</Content>
-	</ItemGroup>
-
-	<Import Project="..\Shared\KZDev.PerfUtils.Memory.Tests.Shared\KZDev.PerfUtils.Memory.Shared.projitems" Label="Shared" />
-
-</Project>
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Sequential.UnitTests/Properties/AssemblyInfo.cs b/Source/Tst/KZDev.PerfUtils.Memory.Sequential.UnitTests/Properties/AssemblyInfo.cs
deleted file mode 100644
index c7fc3b1..0000000
--- a/Source/Tst/KZDev.PerfUtils.Memory.Sequential.UnitTests/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1 +0,0 @@
-[assembly: CollectionBehavior(DisableTestParallelization = true)]
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Sequential.UnitTests/UsingMemoryStreamSlim.cs b/Source/Tst/KZDev.PerfUtils.Memory.Sequential.UnitTests/UsingMemoryStreamSlim.cs
deleted file mode 100644
index b1c8be4..0000000
--- a/Source/Tst/KZDev.PerfUtils.Memory.Sequential.UnitTests/UsingMemoryStreamSlim.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) Kevin Zehrer
-// Licensed under the MIT License. See LICENSE file in the project root for full license information.
-
-using Xunit.Abstractions;
-
-namespace KZDev.PerfUtils.Tests
-{
-    //################################################################################
-    /// <summary>
-    /// Unit tests for the <see cref="MemoryStreamSlim"/> class that never run in 
-    /// parallel with other tests.
-    /// </summary>
-    [Trait(TestConstants.TestTrait.Category, "Memory")]
-    public partial class UsingMemoryStreamSlim : UnitTestBase
-    {
-        //--------------------------------------------------------------------------------
-        /// <summary>
-        /// Initializes a new instance of the <see cref="UsingMemoryStreamSlim"/> class.
-        /// </summary>
-        /// <param name="xUnitTestOutputHelper">
-        /// The Xunit test output helper that can be used to output test messages
-        /// </param>
-        public UsingMemoryStreamSlim (ITestOutputHelper xUnitTestOutputHelper) : base(xUnitTestOutputHelper)
-        {
-        }
-        //--------------------------------------------------------------------------------
-
-        #region Test Methods
-
-        //================================================================================
-
-        //================================================================================
-
-        #endregion Test Methods
-    }
-    //################################################################################
-}
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.Sequential.UnitTests/xunit.runner.json b/Source/Tst/KZDev.PerfUtils.Memory.Sequential.UnitTests/xunit.runner.json
deleted file mode 100644
index 1d2a02c..0000000
--- a/Source/Tst/KZDev.PerfUtils.Memory.Sequential.UnitTests/xunit.runner.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json",
-  "parallelizeAssembly": true,
-  "parallelizeTestCollections" : true,
-}
\ No newline at end of file
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/KZDev.PerfUtils.Memory.UnitTests.csproj b/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/KZDev.PerfUtils.Memory.UnitTests.csproj
index 324ed2a..bf419dd 100644
--- a/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/KZDev.PerfUtils.Memory.UnitTests.csproj
+++ b/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/KZDev.PerfUtils.Memory.UnitTests.csproj
@@ -5,9 +5,9 @@
 	</PropertyGroup>
 
 	<ItemGroup>
-		<PackageReference Include="coverlet.collector" Version="6.0.2" />
-		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
-		<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
+		<PackageReference Include="coverlet.collector" Version="$(PerfUtils-Pkg-coverlet_collector)" />
+		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(PerfUtils-Pkg-Microsoft_NET_Test_Sdk)" />
+		<PackageReference Include="xunit.runner.visualstudio" Version="$(PerfUtils-Pkg-xunit_runner_visualstudio)" />
 	</ItemGroup>
 
 	<ItemGroup>
@@ -31,8 +31,4 @@
 
 	<Import Project="..\Shared\KZDev.PerfUtils.Memory.Tests.Shared\KZDev.PerfUtils.Memory.Shared.projitems" Label="Shared" />
 
-	<Import Project="..\Shared\KZDev.PerfUtils.MemoryStreamSlim.Tests.Shared\KZDev.PerfUtils.MemoryStreamSlim.Tests.Shared.projitems" Label="Shared" />
-
-	<Import Project="..\Shared\KZDev.PerfUtils.TestMocks.Shared\KZDev.PerfUtils.TestMocks.Shared.projitems" Label="Shared" />
-
 </Project>
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/MemorySegmentedBufferGroupUnitTestBase.cs b/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/MemorySegmentedBufferGroupUnitTestBase.cs
new file mode 100644
index 0000000..0c68f1a
--- /dev/null
+++ b/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/MemorySegmentedBufferGroupUnitTestBase.cs
@@ -0,0 +1,74 @@
+using KZDev.PerfUtils.Internals;
+
+using Xunit.Abstractions;
+
+namespace KZDev.PerfUtils.Tests
+{
+    //################################################################################
+    /// <summary>
+    /// Base class for unit tests that use the 
+    /// <see cref="MemorySegmentedBufferGroup"/> system under test.
+    /// </summary>
+    public abstract class MemorySegmentedBufferGroupUnitTestBase : UnitTestBase
+    {
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Initializes a new instance of the <see cref="MemorySegmentedBufferGroupUnitTestBase"/> class.
+        /// </summary>
+        /// <param name="xUnitTestOutputHelper">
+        /// The Xunit test output helper that can be used to output test messages
+        /// </param>
+        protected MemorySegmentedBufferGroupUnitTestBase (ITestOutputHelper xUnitTestOutputHelper) : base(xUnitTestOutputHelper)
+        {
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Returns an instance of the system under test using the specified segment count.
+        /// </summary>
+        /// <param name="segmentCount">
+        /// The number of segments to use in the buffer group.
+        /// </param>
+        /// <param name="useNativeMemory">
+        /// Indicates if native memory should be used for the large memory buffer segments.
+        /// </param>
+        /// <returns>
+        /// An instance of the <see cref="MemorySegmentedBufferGroup"/> system under test.
+        /// </returns>
+        internal MemorySegmentedBufferGroup GetSut (bool useNativeMemory = false, int segmentCount = 16) => new(segmentCount, useNativeMemory);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Returns an instance of the memory segmented buffer pool.
+        /// </summary>
+        /// <param name="useNativeMemory">
+        /// Indicates if native memory should be used for the large memory buffer segments.
+        /// </param>
+        /// <returns>
+        /// A test instance of the <see cref="MemorySegmentedBufferPool"/>.
+        /// </returns>
+        internal MemorySegmentedBufferPool GetTestBufferPool (bool useNativeMemory = false) => new(useNativeMemory);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a test group and pool for testing.
+        /// </summary>
+        /// <param name="useNativeMemory">
+        /// Indicates if native memory should be used for the large memory buffer segments.
+        /// </param>
+        /// <param name="segmentCount">
+        /// The number of segments to use in the buffer group.
+        /// </param>
+        /// <returns>
+        /// Both the buffer group and buffer pool for testing.
+        /// </returns>
+        internal (MemorySegmentedBufferGroup BufferGroup, MemorySegmentedBufferPool BufferPool)
+            GetTestGroupAndPool (bool useNativeMemory = false, int segmentCount = 16)
+        {
+            MemorySegmentedBufferGroup bufferGroup = GetSut(useNativeMemory, segmentCount);
+            MemorySegmentedBufferPool bufferPool = GetTestBufferPool(useNativeMemory);
+
+            return (bufferGroup, bufferPool);
+        }
+        //--------------------------------------------------------------------------------
+
+    }
+    //################################################################################
+}
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/UsingMemoryStreamSegmentedBufferGroup.cs b/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/UsingMemorySegmentedBufferGroup.cs
similarity index 64%
rename from Source/Tst/KZDev.PerfUtils.Memory.UnitTests/UsingMemoryStreamSegmentedBufferGroup.cs
rename to Source/Tst/KZDev.PerfUtils.Memory.UnitTests/UsingMemorySegmentedBufferGroup.cs
index efaf797..07beee5 100644
--- a/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/UsingMemoryStreamSegmentedBufferGroup.cs
+++ b/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/UsingMemorySegmentedBufferGroup.cs
@@ -14,44 +14,19 @@ namespace KZDev.PerfUtils.Tests
     /// Unit tests for the <see cref="MemorySegmentedBufferGroup"/> class.
     /// </summary>
     [Trait(TestConstants.TestTrait.Category, "Memory")]
-    public class UsingMemoryStreamSegmentedBufferGroup : UnitTestBase
+    public class UsingMemorySegmentedBufferGroup : MemorySegmentedBufferGroupUnitTestBase
     {
         //--------------------------------------------------------------------------------
         /// <summary>
-        /// Initializes a new instance of the <see cref="UsingMemoryStreamSegmentedBufferGroup"/> class.
+        /// Initializes a new instance of the <see cref="UsingMemorySegmentedBufferGroup"/> class.
         /// </summary>
         /// <param name="xUnitTestOutputHelper">
         /// The Xunit test output helper that can be used to output test messages
         /// </param>
-        public UsingMemoryStreamSegmentedBufferGroup (ITestOutputHelper xUnitTestOutputHelper) : base(xUnitTestOutputHelper)
+        public UsingMemorySegmentedBufferGroup (ITestOutputHelper xUnitTestOutputHelper) : base(xUnitTestOutputHelper)
         {
         }
         //--------------------------------------------------------------------------------
-        /// <summary>
-        /// Returns an instance of the system under test using the specified segment count.
-        /// </summary>
-        /// <param name="segmentCount">
-        /// The number of segments to use in the buffer group.
-        /// </param>
-        /// <param name="useNativeMemory">
-        /// Indicates if native memory should be used for the large memory buffer segments.
-        /// </param>
-        /// <returns>
-        /// An instance of the <see cref="MemorySegmentedBufferGroup"/> system under test.
-        /// </returns>
-        private MemorySegmentedBufferGroup GetSut (bool useNativeMemory = false, int segmentCount = 16) => new(segmentCount, useNativeMemory);
-        //--------------------------------------------------------------------------------
-        /// <summary>
-        /// Returns an instance of the memory segmented buffer pool.
-        /// </summary>
-        /// <param name="useNativeMemory">
-        /// Indicates if native memory should be used for the large memory buffer segments.
-        /// </param>
-        /// <returns>
-        /// A test instance of the <see cref="MemorySegmentedBufferPool"/>.
-        /// </returns>
-        private MemorySegmentedBufferPool GetTestBufferPool (bool useNativeMemory = false) => new(useNativeMemory);
-        //--------------------------------------------------------------------------------
 
         #region Test Methods
 
@@ -63,7 +38,7 @@ public UsingMemoryStreamSegmentedBufferGroup (ITestOutputHelper xUnitTestOutputH
         /// various segment counts and verifies that the segment count is correct.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GettingInstanceWithVariousSegmentCounts_SegmentCountIsCorrect ()
+        public void UsingMemorySegmentedBufferGroup_GettingInstanceWithVariousSegmentCounts_SegmentCountIsCorrect ()
         {
             for (int testLoop = 0; testLoop < 100; testLoop++)
             {
@@ -78,10 +53,9 @@ public void UsingMemoryStreamSegmentedBufferGroup_GettingInstanceWithVariousSegm
         /// requesting all the segments and verifies that the buffer is the correct size.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetFullGroupBuffer_ReturnsProperBuffer ()
+        public void UsingMemorySegmentedBufferGroup_GetFullGroupBuffer_ReturnsProperBuffer ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
             int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * sut.SegmentCount;
 
             (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestBufferSize, false, bufferPool);
@@ -99,10 +73,9 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetFullGroupBuffer_ReturnsProp
         /// with as many segments as are available.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_TryTooLargeGetBuffer_ReturnsSegmentWithPartOfRequest ()
+        public void UsingMemorySegmentedBufferGroup_TryTooLargeGetBuffer_ReturnsSegmentWithPartOfRequest ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
             int expectedBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * sut.SegmentCount;
             int requestBufferSize = expectedBufferSize + MemorySegmentedBufferGroup.StandardBufferSegmentSize;
 
@@ -121,10 +94,9 @@ public void UsingMemoryStreamSegmentedBufferGroup_TryTooLargeGetBuffer_ReturnsSe
         /// in the different buffers, and they are all the correct size.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetThreeBuffers_BuffersReturnedAreCorrectSizeAndValues ()
+        public void UsingMemorySegmentedBufferGroup_GetThreeBuffers_BuffersReturnedAreCorrectSizeAndValues ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
             int availableSegments = sut.SegmentCount;
             int[] getSegments = new int[3];
             // We don't want single segment buffers
@@ -153,13 +125,12 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetThreeBuffers_BuffersReturne
         //--------------------------------------------------------------------------------    
         /// <summary>
         /// Tests getting a single segment buffer from the <see cref="MemorySegmentedBufferGroup"/> class
-        /// which should be allocated at the end of the buffer group.
+        /// which should be allocated at the start of the buffer group.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetSingleNonZeroedSegmentBuffer_ShouldAllocateFromTheEnd ()
+        public void UsingMemorySegmentedBufferGroup_GetSingleNonZeroedSegmentBuffer_ShouldAllocateFromTheStart ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
             int bufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
 
             (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(bufferSize, false, bufferPool);
@@ -168,23 +139,21 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetSingleNonZeroedSegmentBuffe
             buffer.Length.Should().Be(bufferSize);
             buffer.SegmentCount.Should().Be(1);
             buffer.BufferInfo.BlockId.Should().Be(sut.Id);
-            buffer.BufferInfo.SegmentId.Should().Be(sut.SegmentCount - 1);
+            buffer.BufferInfo.SegmentId.Should().Be(0);
         }
         //--------------------------------------------------------------------------------    
         /// <summary>
         /// Tests getting a single segment buffer from the <see cref="MemorySegmentedBufferGroup"/> class
-        /// which should be allocated at the end of the free segments in the buffer group.
+        /// which should be allocated at the start of the free segments in the buffer group.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetSingleNonZeroedSegmentBuffer_ShouldAllocateFromTheEndOfAvailable ()
+        public void UsingMemorySegmentedBufferGroup_GetSingleNonZeroedSegmentBuffer_ShouldAllocateFromTheStartOfAvailable ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
             int bufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
             int markSegmentCount = sut.SegmentCount / 2;
-            int markFirstSegment = sut.SegmentCount / 2;
 
-            sut.SetSegmentsUsed(markFirstSegment, markSegmentCount);
+            sut.SetSegmentsUsed(0, markSegmentCount);
 
             (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(bufferSize, false, bufferPool);
 
@@ -192,7 +161,7 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetSingleNonZeroedSegmentBuffe
             buffer.Length.Should().Be(bufferSize);
             buffer.SegmentCount.Should().Be(1);
             buffer.BufferInfo.BlockId.Should().Be(sut.Id);
-            buffer.BufferInfo.SegmentId.Should().Be(markFirstSegment - 1);
+            buffer.BufferInfo.SegmentId.Should().Be(markSegmentCount);
         }
         //--------------------------------------------------------------------------------    
         /// <summary>
@@ -200,10 +169,9 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetSingleNonZeroedSegmentBuffe
         /// which should be allocated at the end of the free segments in the buffer group.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetSingleNonZeroedSegmentBuffer_FromSingleAvailableSegments_ShouldAllocateFromAvailableSegment ()
+        public void UsingMemorySegmentedBufferGroup_GetSingleNonZeroedSegmentBuffer_FromSingleAvailableSegments_ShouldAllocateFromAvailableSegment ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
             int bufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
             int markSegmentIndex = sut.SegmentCount - 1;
 
@@ -225,13 +193,12 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetSingleNonZeroedSegmentBuffe
         //--------------------------------------------------------------------------------    
         /// <summary>
         /// Tests getting a single segment buffer from the <see cref="MemorySegmentedBufferGroup"/> class
-        /// which should be allocated at the end of the buffer group.
+        /// which should be allocated at the start of the buffer group.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetSingleZeroedSegmentBuffer_ShouldAllocateFromTheEnd ()
+        public void UsingMemorySegmentedBufferGroup_GetSingleZeroedSegmentBuffer_ShouldAllocateFromTheStart ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
             int bufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
 
             (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(bufferSize, true, bufferPool);
@@ -240,24 +207,22 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetSingleZeroedSegmentBuffer_S
             buffer.Length.Should().Be(bufferSize);
             buffer.SegmentCount.Should().Be(1);
             buffer.BufferInfo.BlockId.Should().Be(sut.Id);
-            buffer.BufferInfo.SegmentId.Should().Be(sut.SegmentCount - 1);
+            buffer.BufferInfo.SegmentId.Should().Be(0);
             buffer.IsAllZeroes().Should().BeTrue();
         }
         //--------------------------------------------------------------------------------    
         /// <summary>
         /// Tests getting a single segment buffer from the <see cref="MemorySegmentedBufferGroup"/> class
-        /// which should be allocated at the end of the free segments in the buffer group.
+        /// which should be allocated at the start of the free segments in the buffer group.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetSingleZeroedSegmentBuffer_ShouldAllocateFromTheEndOfAvailable ()
+        public void UsingMemorySegmentedBufferGroup_GetSingleZeroedSegmentBuffer_ShouldAllocateFromTheStartOfAvailable ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
             int bufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
             int markSegmentCount = sut.SegmentCount / 2;
-            int markFirstSegment = sut.SegmentCount / 2;
 
-            sut.SetSegmentsUsed(markFirstSegment, markSegmentCount);
+            sut.SetSegmentsUsed(0, markSegmentCount);
 
             (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(bufferSize, true, bufferPool);
 
@@ -265,7 +230,7 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetSingleZeroedSegmentBuffer_S
             buffer.Length.Should().Be(bufferSize);
             buffer.SegmentCount.Should().Be(1);
             buffer.BufferInfo.BlockId.Should().Be(sut.Id);
-            buffer.BufferInfo.SegmentId.Should().Be(markFirstSegment - 1);
+            buffer.BufferInfo.SegmentId.Should().Be(markSegmentCount);
             buffer.IsAllZeroes().Should().BeTrue();
         }
         //--------------------------------------------------------------------------------    
@@ -274,10 +239,9 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetSingleZeroedSegmentBuffer_S
         /// which should be allocated at the end of the free segments in the buffer group.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetSingleZeroedSegmentBuffer_FromSingleAvailableSegments_ShouldAllocateFromAvailableSegment ()
+        public void UsingMemorySegmentedBufferGroup_GetSingleZeroedSegmentBuffer_FromSingleAvailableSegments_ShouldAllocateFromAvailableSegment ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
             int bufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
             int markSegmentIndex = sut.SegmentCount - 1;
 
@@ -303,10 +267,9 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetSingleZeroedSegmentBuffer_F
         /// one more time than there are segments and verifies that we get the proper result.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetSingleSegmentAfterFull_ShouldReturnFullResult ()
+        public void UsingMemorySegmentedBufferGroup_GetSingleSegmentAfterFull_ShouldReturnFullResult ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
             int bufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
 
             for (int segmentNumber = 0; segmentNumber < sut.SegmentCount; segmentNumber++)
@@ -317,7 +280,7 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetSingleSegmentAfterFull_Shou
                 buffer.Length.Should().Be(bufferSize);
                 buffer.SegmentCount.Should().Be(1);
                 buffer.BufferInfo.BlockId.Should().Be(sut.Id);
-                buffer.BufferInfo.SegmentId.Should().Be(sut.SegmentCount - segmentNumber - 1);
+                buffer.BufferInfo.SegmentId.Should().Be(segmentNumber);
                 buffer.IsAllZeroes().Should().BeTrue();
             }
 
@@ -329,6 +292,65 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetSingleSegmentAfterFull_Shou
 
         #endregion Single Segment Allocation
 
+
+        #region Single Preferred Segment Allocation
+
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests getting a single preferred segment buffer from the <see cref="MemorySegmentedBufferGroup"/> class
+        /// which should be allocated at the preferred segment index.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetSinglePreferredSegmentBuffer_ShouldAllocateStartingAtPreferredIndex ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
+            int requestFirstBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * GetTestInteger(1, sut.SegmentCount);
+
+            (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestFirstBufferSize, false, bufferPool);
+
+            result.Should().Be(GetBufferResult.Available);
+            buffer.Length.Should().Be(requestFirstBufferSize);
+            buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+            buffer.BufferInfo.SegmentId.Should().Be(0);
+
+            (SegmentBuffer nextBuffer, GetBufferResult nextResult, bool isPreferredSegment) =
+                sut.GetBuffer(MemorySegmentedBufferGroup.StandardBufferSegmentSize, false, bufferPool, buffer.SegmentCount);
+            nextResult.Should().Be(GetBufferResult.Available);
+            nextBuffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize);
+            isPreferredSegment.Should().BeTrue();
+            nextBuffer.BufferInfo.BlockId.Should().Be(sut.Id);
+            nextBuffer.BufferInfo.SegmentId.Should().Be(buffer.SegmentCount);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests getting a single preferred segment buffer from the <see cref="MemorySegmentedBufferGroup"/> class
+        /// which should be allocated at the preferred segment index.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetSinglePreferredSegmentBuffer_FromSingleAvailableSegment_ShouldAllocateStartingAtPreferredIndex ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
+            int requestFirstBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (sut.SegmentCount - 1);
+
+            (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestFirstBufferSize, false, bufferPool);
+
+            result.Should().Be(GetBufferResult.Available);
+            buffer.Length.Should().Be(requestFirstBufferSize);
+            buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+            buffer.BufferInfo.SegmentId.Should().Be(0);
+
+            (SegmentBuffer nextBuffer, GetBufferResult nextResult, bool isPreferredSegment) =
+                sut.GetBuffer(MemorySegmentedBufferGroup.StandardBufferSegmentSize, false, bufferPool, buffer.SegmentCount);
+            nextResult.Should().Be(GetBufferResult.Available);
+            nextBuffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize);
+            isPreferredSegment.Should().BeTrue();
+            nextBuffer.BufferInfo.BlockId.Should().Be(sut.Id);
+            nextBuffer.BufferInfo.SegmentId.Should().Be(buffer.SegmentCount);
+        }
+        //--------------------------------------------------------------------------------    
+
+        #endregion Single Preferred Segment Allocation
+
         #region Multiple Segment Allocation
 
         //--------------------------------------------------------------------------------    
@@ -337,10 +359,9 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetSingleSegmentAfterFull_Shou
         /// which should be allocated at the end of the buffer group.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleNonZeroedSegmentBuffer_ShouldAllocateFromTheStart ()
+        public void UsingMemorySegmentedBufferGroup_GetMultipleNonZeroedSegmentBuffer_ShouldAllocateFromTheStart ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
             int segmentCount = GetTestInteger(2, sut.SegmentCount);
             int bufferSize = segmentCount * MemorySegmentedBufferGroup.StandardBufferSegmentSize;
 
@@ -358,10 +379,9 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleNonZeroedSegmentBuf
         /// which should be allocated at the end of the free segments in the buffer group.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleNonZeroedSegmentBuffer_ShouldAllocateFromTheStartOfAvailable ()
+        public void UsingMemorySegmentedBufferGroup_GetMultipleNonZeroedSegmentBuffer_ShouldAllocateFromTheStartOfAvailable ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
             int segmentCount = GetTestInteger(2, sut.SegmentCount - 4);
             int bufferSize = segmentCount * MemorySegmentedBufferGroup.StandardBufferSegmentSize;
             int markSegmentCount = GetTestInteger(1, sut.SegmentCount - segmentCount + 1);
@@ -382,10 +402,9 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleNonZeroedSegmentBuf
         /// which should be allocated at the end of the free segments in the buffer group.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleNonZeroedSegmentBuffer_FromSingleAvailableSegments_ShouldAllocateFromAvailableSegment ()
+        public void UsingMemorySegmentedBufferGroup_GetMultipleNonZeroedSegmentBuffer_FromSingleAvailableSegments_ShouldAllocateFromAvailableSegment ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
 
             for (int fillSegmentCount = 1; fillSegmentCount < sut.SegmentCount - 2; fillSegmentCount++)
             {
@@ -410,10 +429,9 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleNonZeroedSegmentBuf
         /// which should be allocated at the end of the buffer group.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleZeroedSegmentBuffer_ShouldAllocateFromTheStart ()
+        public void UsingMemorySegmentedBufferGroup_GetMultipleZeroedSegmentBuffer_ShouldAllocateFromTheStart ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
             int segmentCount = GetTestInteger(2, sut.SegmentCount);
             int bufferSize = segmentCount * MemorySegmentedBufferGroup.StandardBufferSegmentSize;
 
@@ -432,10 +450,9 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleZeroedSegmentBuffer
         /// which should be allocated at the end of the free segments in the buffer group.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleZeroedSegmentBuffer_ShouldAllocateFromTheStartOfAvailable ()
+        public void UsingMemorySegmentedBufferGroup_GetMultipleZeroedSegmentBuffer_ShouldAllocateFromTheStartOfAvailable ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
             int segmentCount = GetTestInteger(2, sut.SegmentCount - 4);
             int bufferSize = segmentCount * MemorySegmentedBufferGroup.StandardBufferSegmentSize;
             int markSegmentCount = GetTestInteger(1, sut.SegmentCount - segmentCount + 1);
@@ -457,10 +474,9 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleZeroedSegmentBuffer
         /// which should be allocated at the end of the free segments in the buffer group.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleZeroedSegmentBuffer_FromSingleAvailableSegments_ShouldAllocateFromAvailableSegment ()
+        public void UsingMemorySegmentedBufferGroup_GetMultipleZeroedSegmentBuffer_FromSingleAvailableSegments_ShouldAllocateFromAvailableSegment ()
         {
-            MemorySegmentedBufferGroup sut = GetSut();
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
 
             for (int fillSegmentCount = 1; fillSegmentCount < sut.SegmentCount - 2; fillSegmentCount++)
             {
@@ -487,10 +503,9 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleZeroedSegmentBuffer
         /// to fulfill the request, and this should return the largest available.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleSegmentBuffer_LargerThanAvailable_WithProgressivelyLargerHoles_ShouldReturnLargestAvailable ()
+        public void UsingMemorySegmentedBufferGroup_GetMultipleSegmentBuffer_LargerThanAvailable_WithProgressivelyLargerHoles_ShouldReturnLargestAvailable ()
         {
-            MemorySegmentedBufferGroup sut = GetSut(segmentCount: 128);
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
 
             sut.SetAllSegmentsUsed();
             int currentOpenSegmentCount = 1;
@@ -523,10 +538,9 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleSegmentBuffer_Large
         /// to fulfill the request, and this should return the largest available.
         /// </summary>
         [Fact]
-        public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleSegmentBuffer_LargerThanAvailable_WithProgressivelySmallerHoles_ShouldReturnLargestAvailable ()
+        public void UsingMemorySegmentedBufferGroup_GetMultipleSegmentBuffer_LargerThanAvailable_WithProgressivelySmallerHoles_ShouldReturnLargestAvailable ()
         {
-            MemorySegmentedBufferGroup sut = GetSut(segmentCount: 128);
-            MemorySegmentedBufferPool bufferPool = GetTestBufferPool();
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
 
             sut.SetAllSegmentsUsed();
             int currentOpenSegmentCount = 1;
@@ -556,6 +570,68 @@ public void UsingMemoryStreamSegmentedBufferGroup_GetMultipleSegmentBuffer_Large
 
         #endregion Multiple Segment Allocation
 
+        #region Multiple Preferred Segment Allocation
+
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests getting a multiple preferred segment buffer from the <see cref="MemorySegmentedBufferGroup"/> class
+        /// which should be allocated at the preferred segment index.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetMultiplePreferredSegmentBuffer_ShouldAllocateStartingAtPreferredIndex ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
+            int firstRequestSegmentCount = GetTestInteger(1, sut.SegmentCount - 1);
+            int requestFirstBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * firstRequestSegmentCount;
+
+            (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestFirstBufferSize, false, bufferPool);
+
+            result.Should().Be(GetBufferResult.Available);
+            buffer.Length.Should().Be(requestFirstBufferSize);
+            buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+            buffer.BufferInfo.SegmentId.Should().Be(0);
+
+            int nextRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (sut.SegmentCount - firstRequestSegmentCount);
+            (SegmentBuffer nextBuffer, GetBufferResult nextResult, bool isPreferredSegment) =
+                sut.GetBuffer(nextRequestBufferSize, false, bufferPool, buffer.SegmentCount);
+            nextResult.Should().Be(GetBufferResult.Available);
+            nextBuffer.Length.Should().Be(nextRequestBufferSize);
+            isPreferredSegment.Should().BeTrue();
+            nextBuffer.BufferInfo.BlockId.Should().Be(sut.Id);
+            nextBuffer.BufferInfo.SegmentId.Should().Be(buffer.SegmentCount);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests getting a multiple preferred segment buffer from the <see cref="MemorySegmentedBufferGroup"/> class
+        /// which should be allocated at the preferred segment index.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetMultiplePreferredSegmentBuffer_FromSingleAvailableSegment_ShouldAllocateStartingAtPreferredIndex ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
+            int requestFirstBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (sut.SegmentCount - 1);
+
+            (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestFirstBufferSize, false, bufferPool);
+
+            result.Should().Be(GetBufferResult.Available);
+            buffer.Length.Should().Be(requestFirstBufferSize);
+            buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+            buffer.BufferInfo.SegmentId.Should().Be(0);
+
+            // We are going to request a buffer that is one segment larger than the available segment, but we should
+            // get just one segment back
+            (SegmentBuffer nextBuffer, GetBufferResult nextResult, bool isPreferredSegment) =
+                sut.GetBuffer(MemorySegmentedBufferGroup.StandardBufferSegmentSize * 2, false, bufferPool, buffer.SegmentCount);
+            nextResult.Should().Be(GetBufferResult.Available);
+            nextBuffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize);
+            isPreferredSegment.Should().BeTrue();
+            nextBuffer.BufferInfo.BlockId.Should().Be(sut.Id);
+            nextBuffer.BufferInfo.SegmentId.Should().Be(buffer.SegmentCount);
+        }
+        //--------------------------------------------------------------------------------    
+
+        #endregion Multiple Preferred Segment Allocation
+
         //================================================================================
 
         #endregion Test Methods
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/UsingMemorySegmentedBufferGroupWithUsedPatterns.cs b/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/UsingMemorySegmentedBufferGroupWithUsedPatterns.cs
new file mode 100644
index 0000000..77c96c6
--- /dev/null
+++ b/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/UsingMemorySegmentedBufferGroupWithUsedPatterns.cs
@@ -0,0 +1,1974 @@
+// Copyright (c) Kevin Zehrer
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+
+using System.Reflection;
+
+using FluentAssertions;
+
+using KZDev.PerfUtils.Internals;
+
+using Xunit.Abstractions;
+
+namespace KZDev.PerfUtils.Tests
+{
+    //################################################################################
+    /// <summary>
+    /// Unit tests for the <see cref="MemorySegmentedBufferGroup"/> class where the 
+    /// state of the group is set to specific patterns before the tests are run.
+    /// </summary>
+    public class UsingMemorySegmentedBufferGroupWithUsedPatterns : MemorySegmentedBufferGroupUnitTestBase
+    {
+        /// <summary>
+        /// The size of the block flag set/group (contained in a ulong)
+        /// </summary>
+        internal const int BlockFlagSetSize = 64;  // 64 bits in a ulong
+
+        /// <summary>
+        /// The field information for the _segmentCount field in the buffer group.
+        /// </summary>
+        private static readonly FieldInfo BufferGroupSegmentCountField =
+            typeof(MemorySegmentedBufferGroup)
+                .GetField("_segmentCount",
+                BindingFlags.NonPublic | BindingFlags.Instance);
+
+        /// <summary>
+        /// The field information for the _segmentsInUse field in the buffer group.
+        /// </summary>
+        private static readonly FieldInfo BufferGroupSegmentsInUseField =
+            typeof(MemorySegmentedBufferGroup)
+                .GetField("_segmentsInUse",
+                BindingFlags.NonPublic | BindingFlags.Instance);
+
+        /// <summary>
+        /// The field information for the _blockUsedFlags field in the buffer group.
+        /// </summary>
+        private static readonly FieldInfo BlockUsedFlagsField =
+            typeof(MemorySegmentedBufferGroup)
+                .GetField("_blockUsedFlags",
+                BindingFlags.NonPublic | BindingFlags.Instance);
+
+        /// <summary>
+        /// The field information for the _blockZeroFlags field in the buffer group.
+        /// </summary>
+        private static readonly FieldInfo BlockZeroFlagsField =
+            typeof(MemorySegmentedBufferGroup)
+                .GetField("_blockZeroFlags",
+                BindingFlags.NonPublic | BindingFlags.Instance);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// For a given segment index, returns the index of the ulong in the block flag
+        /// array as well as the mask to use to set or check the flag for the segment.
+        /// </summary>
+        /// <param name="segmentIndex">
+        /// The segment index number to get the flag index and mask for.
+        /// </param>
+        /// <returns>
+        /// The index of the ulong in the block flag array and the mask to use for the
+        /// </returns>
+        private static (int Index, ulong Mask) GetFlagIndexAndMask (int segmentIndex)
+        {
+            int index = Math.DivRem(segmentIndex, BlockFlagSetSize, out int offset);
+            return (index, 1UL << offset);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Uses reflection to get the count of segments in the buffer group.
+        /// </summary>
+        /// <param name="bufferGroup">
+        /// The buffer group to get the segment count for.
+        /// </param>
+        /// <returns>
+        /// The value of the _segmentCount field in the buffer group.
+        /// </returns>
+        private static int GetSegmentCount (MemorySegmentedBufferGroup bufferGroup) =>
+            (int)BufferGroupSegmentCountField.GetValue(bufferGroup);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Sets the count of segments in the buffer group using reflection.
+        /// </summary>
+        /// <param name="bufferGroup">
+        /// The buffer group to set the segment count for.
+        /// </param>
+        /// <param name="segmentCount">
+        /// The value of the _segmentCount field to set in the buffer group.
+        /// </param>
+        private static void SetSegmentCount (MemorySegmentedBufferGroup bufferGroup, int segmentCount)
+        {
+            BufferGroupSegmentCountField.SetValue(bufferGroup, segmentCount);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets the number of block flag ulong values in the block flag array that are 
+        /// needed to store the block flags for the specified buffer group based on the
+        /// number of segments in the group.
+        /// </summary>
+        /// <param name="bufferGroup">
+        /// The buffer group to get the block flag array size needed for.
+        /// </param>
+        /// <returns>
+        /// The number of block flag ulong values needed to store the block flags for the
+        /// </returns>
+        private static int GetBlockFlagArraySizeNeeded (MemorySegmentedBufferGroup bufferGroup)
+        {
+            int segmentCount = GetSegmentCount(bufferGroup);
+            return (segmentCount + BlockFlagSetSize - 1) / BlockFlagSetSize;
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets the number of segments in the buffer group that are in use.
+        /// </summary>
+        /// <param name="bufferGroup">
+        /// The buffer group to get the number of segments in use for.
+        /// </param>
+        /// <returns>
+        /// The number of segments in the buffer group that are in use.
+        /// </returns>
+        private static int GetSegmentsInUse (MemorySegmentedBufferGroup bufferGroup) =>
+            (int)BufferGroupSegmentsInUseField.GetValue(bufferGroup);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Sets the number of segments in the buffer group that are in use.
+        /// </summary>
+        /// <param name="bufferGroup">
+        /// The buffer group to set the number of segments in use for.
+        /// </param>
+        /// <param name="segmentsInUse">
+        /// The number of segments in the buffer group that are in use.
+        /// </param>
+        private static void SetSegmentsInUse (MemorySegmentedBufferGroup bufferGroup, int segmentsInUse)
+        {
+            BufferGroupSegmentsInUseField.SetValue(bufferGroup, segmentsInUse);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Sets the block used flags for the buffer group to the specified ulong array.
+        /// </summary>
+        /// <param name="bufferGroup">
+        /// The buffer group to set the block used flags for.
+        /// </param>
+        /// <param name="blockUsedFlags">
+        /// The ulong array of block used flags to set in the buffer group.
+        /// </param>
+        /// <param name="blockZeroFlags">
+        /// The ulong array of block zero flags to set in the buffer group.
+        /// </param>
+        private static (int availableSegmentCount, Dictionary<int, List<int>> availableSegmentMap)
+            SetBlockUsedFlags (MemorySegmentedBufferGroup bufferGroup, ulong[] blockUsedFlags, ulong[] blockZeroFlags)
+        {
+            // Get the number of segments in the buffer group
+            int segmentFlagsToSet = GetSegmentCount(bufferGroup);
+            // Build our own array to be sure we have the right size
+            int blockFlagArraySize = GetBlockFlagArraySizeNeeded(bufferGroup);
+            ulong[] setBlockUsedFlags = new ulong[blockFlagArraySize];
+            ulong[] setBlockZeroFlags = new ulong[blockFlagArraySize];
+            // Track the number of segments marked in use
+            int segmentsAvailable = segmentFlagsToSet;
+            int segmentsInUse = 0;
+            int blockFlagIndex = 0;
+            ulong blockFlagMask = 1;
+            Dictionary<int, List<int>> availableSegmentMap = new();
+            // Track the running list of available segments
+            int? availableSegmentRunStart = null;
+            int availableSegmentRunCount = 0;
+
+            // Loop through the requested flags
+            for (int segmentIndex = 0; segmentIndex < segmentFlagsToSet; segmentIndex++)
+            {
+                // Set the block used flag
+                if ((blockFlagIndex < blockUsedFlags.Length)  &&
+                    ((blockUsedFlags[blockFlagIndex] & blockFlagMask) == blockFlagMask))
+                {
+                    setBlockUsedFlags[blockFlagIndex] |= blockFlagMask;
+                    segmentsInUse++;
+                    segmentsAvailable--;
+                    // Store and reset the available segment run tracking
+                    if (availableSegmentRunCount > 0)
+                    {
+                        UpdateAvailableSegmentMap(availableSegmentMap, ref availableSegmentRunStart, ref availableSegmentRunCount);
+                    }
+                }
+                else
+                {
+                    // Update the available segment run tracking
+                    availableSegmentRunStart??= segmentIndex;
+                    availableSegmentRunCount++;
+                }
+
+                // Set the block zero flag
+                if ((blockFlagIndex < blockZeroFlags.Length)  &&
+                    ((blockZeroFlags[blockFlagIndex] & blockFlagMask) == blockFlagMask))
+                {
+                    setBlockZeroFlags[blockFlagIndex] |= blockFlagMask;
+                }
+
+                // Move to the next block flag
+                blockFlagMask <<= 1;
+                if (blockFlagMask != 0)
+                {
+                    continue;
+                }
+
+                blockFlagMask = 1;
+                blockFlagIndex++;
+            }
+            // Do a last update of the available segment map
+            UpdateAvailableSegmentMap(availableSegmentMap, ref availableSegmentRunStart, ref availableSegmentRunCount);
+
+            BlockUsedFlagsField.SetValue(bufferGroup, setBlockUsedFlags);
+            BlockZeroFlagsField.SetValue(bufferGroup, setBlockZeroFlags);
+            SetSegmentsInUse(bufferGroup, segmentsInUse);
+            return (segmentsAvailable, availableSegmentMap);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Sets the block used flags for the buffer group to the specified boolean array,
+        /// converting the array to a ulong array for storage in the buffer group.
+        /// </summary>
+        /// <param name="bufferGroup">
+        /// The buffer group to set the block used flags for.
+        /// </param>
+        /// <param name="blockUsedFlags">
+        /// The boolean array of block used flags to set in the buffer group.
+        /// </param>
+        /// <param name="blockZeroFlags">
+        /// The boolean array of block zero flags to set in the buffer group.
+        /// </param>
+        private static (int availableSegmentCount, Dictionary<int, List<int>> availableSegmentMap)
+            SetBlockUsedFlags (MemorySegmentedBufferGroup bufferGroup, bool[] blockUsedFlags, bool[] blockZeroFlags)
+        {
+            // Get the number of segments in the buffer group
+            int segmentFlagsToSet = GetSegmentCount(bufferGroup);
+            // Build our own array to be sure we have the right size
+            int blockFlagArraySize = GetBlockFlagArraySizeNeeded(bufferGroup);
+            ulong[] setBlockUsedFlags = new ulong[blockFlagArraySize];
+            ulong[] setBlockZeroFlags = new ulong[blockFlagArraySize];
+
+            // Set the proper flags in the ulong arrays
+            for (int segmentIndex = 0; segmentIndex < segmentFlagsToSet; segmentIndex++)
+            {
+                int flagIndex = Math.DivRem(segmentIndex, BlockFlagSetSize, out int flagOffset);
+                ulong flagMask = 1UL << flagOffset;
+
+                if ((segmentIndex < blockUsedFlags.Length) && blockUsedFlags[segmentIndex])
+                {
+                    setBlockUsedFlags[flagIndex] |= flagMask;
+                }
+
+                if ((segmentIndex < blockZeroFlags.Length) && blockZeroFlags[segmentIndex])
+                {
+                    setBlockZeroFlags[flagIndex] |= flagMask;
+                }
+            }
+            return SetBlockUsedFlags(bufferGroup, setBlockUsedFlags, setBlockZeroFlags);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Helper to update the available segment map with the current run of available segments.
+        /// </summary>
+        /// <param name="availableSegmentMap">
+        /// The map of available segment runs to update.
+        /// </param>
+        /// <param name="availableSegmentRunStart">
+        /// The start index of the current run of available segments (if any).
+        /// </param>
+        /// <param name="availableSegmentRunCount">
+        /// The current count of available segments in the run.
+        /// </param>
+        private static void UpdateAvailableSegmentMap (Dictionary<int, List<int>> availableSegmentMap,
+            ref int? availableSegmentRunStart, ref int availableSegmentRunCount)
+        {
+            if (availableSegmentRunCount <= 0)
+            {
+                availableSegmentRunStart = null;
+                availableSegmentRunCount = 0;
+                return;
+            }
+
+            if (availableSegmentMap.TryGetValue(availableSegmentRunCount, out List<int> segmentList))
+            {
+                segmentList.Add(availableSegmentRunStart!.Value);
+            }
+            else
+            {
+                availableSegmentMap[availableSegmentRunCount] = [availableSegmentRunStart!.Value];
+            }
+            availableSegmentRunStart = null;
+            availableSegmentRunCount = 0;
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Sets the in use flags for the segments in the buffer group to the specified 
+        /// repeating pattern based on the number of segments in the group by starting with
+        /// setting the in use segments and then the available segments.
+        /// </summary>
+        /// <param name="skipCount">
+        /// The number of segments to skip before starting the pattern.
+        /// </param>
+        /// <param name="bufferGroup">
+        /// The buffer group to set the in use flags for.
+        /// </param>
+        /// <param name="pattern">
+        /// The repeating pattern of in use and available segments to set in the buffer group.
+        /// </param>
+        /// <returns>
+        /// The number of segments available for use in the buffer group.
+        /// </returns>>
+        private static (int availableSegmentCount, Dictionary<int, List<int>> availableSegmentMap)
+            SetSegmentInUsePattern (MemorySegmentedBufferGroup bufferGroup,
+                int skipCount, params (int inUseCount, int availableCount, bool availableAreZeroed)[] pattern)
+        {
+            // Get the number of segments in the buffer group
+            int segmentCount = GetSegmentCount(bufferGroup);
+            // The segment in use flags and zeroed to set
+            bool[] segmentInUseFlags = new bool[segmentCount];
+            bool[] segmentZeroFlags = new bool[segmentCount];
+            // Track the number of segments marked as available
+            int patternIndex = 0;
+            // Get the values for the first pattern
+            (int inUseCount, int availableCount, bool availableAreZeroed) = pattern[patternIndex];
+
+            // Loop through the segments in the buffer group
+            for (int segmentIndex = Math.Max(0, skipCount); segmentIndex < segmentCount; segmentIndex++)
+            {
+                // Set the in use flags for the segment if we are still in the "in-use" part of the pattern
+                if (inUseCount > 0)
+                {
+                    segmentInUseFlags[segmentIndex] = true;
+                    inUseCount--;
+                    // Store and reset the available segment run tracking
+                    continue;
+                }
+                if (availableCount > 0)
+                {
+                    // Set the zero flag for the segment if needed
+                    segmentZeroFlags[segmentIndex] = availableAreZeroed;
+                    availableCount--;
+                    continue;
+                }
+                // We have exhausted the current pattern, move to the next one
+                patternIndex = (patternIndex + 1) % pattern.Length;
+                (inUseCount, availableCount, availableAreZeroed) = pattern[patternIndex];
+                // But we also have to back up the segment index
+                segmentIndex--;
+            }
+
+            // Set the flags in the buffer group
+            return SetBlockUsedFlags(bufferGroup, segmentInUseFlags, segmentZeroFlags);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Sets the in use flags for the segments in the buffer group to the specified 
+        /// repeating pattern based on the number of segments in the group, but starts with
+        /// skipping the available segments and then setting the in use segments.
+        /// </summary>
+        /// <param name="skipCount">
+        /// The number of segments to skip before starting the pattern.
+        /// </param>
+        /// <param name="bufferGroup">
+        /// The buffer group to set the in use flags for.
+        /// </param>
+        /// <param name="pattern">
+        /// The repeating pattern of in use and available segments to set in the buffer group.
+        /// </param>
+        /// <returns>
+        /// The number of segments available for use in the buffer group.
+        /// </returns>>
+        private static (int availableSegmentCount, Dictionary<int, List<int>> availableSegmentMap)
+            SetSegmentAvailablePattern (MemorySegmentedBufferGroup bufferGroup,
+                int skipCount, params (int availableCount, int inUseCount, bool availableAreZeroed)[] pattern)
+        {
+            // Get the number of segments in the buffer group
+            int segmentCount = GetSegmentCount(bufferGroup);
+            // The segment in use flags and zeroed to set
+            bool[] segmentInUseFlags = new bool[segmentCount];
+            bool[] segmentZeroFlags = new bool[segmentCount];
+            // Track the number of segments marked as available
+            int segmentsAvailable = segmentCount;
+            int patternIndex = 0;
+            Dictionary<int, List<int>> availableSegmentMap = new();
+            // Track the running list of available segments
+            int? availableSegmentRunStart = null;
+            int availableSegmentRunCount = 0;
+            // If we have a skip count, we need to track the available segments
+            if (skipCount > 0)
+            {
+                availableSegmentRunStart = 0;
+                availableSegmentRunCount = skipCount;
+            }
+            // Get the values for the first pattern
+            (int availableCount, int inUseCount, bool availableAreZeroed) = pattern[patternIndex];
+
+            // Loop through the segments in the buffer group
+            for (int segmentIndex = Math.Max(0, skipCount); segmentIndex < segmentCount; segmentIndex++)
+            {
+                // Skip the available segments if we are still in the "available" part of the pattern
+                if (availableCount > 0)
+                {
+                    // Update the available segment run tracking
+                    availableSegmentRunStart??= segmentIndex;
+                    availableSegmentRunCount++;
+                    // Set the zero flag for the segment if needed
+                    segmentZeroFlags[segmentIndex] = availableAreZeroed;
+                    availableCount--;
+                    continue;
+                }
+                if (inUseCount > 0)
+                {
+                    segmentInUseFlags[segmentIndex] = true;
+                    segmentsAvailable--;
+                    inUseCount--;
+                    // Store and reset the available segment run tracking
+                    if (availableSegmentRunCount > 0)
+                    {
+                        UpdateAvailableSegmentMap(availableSegmentMap, ref availableSegmentRunStart, ref availableSegmentRunCount);
+                    }
+                    continue;
+                }
+                // We have exhausted the current pattern, move to the next one
+                patternIndex = (patternIndex + 1) % pattern.Length;
+                (availableCount, inUseCount, availableAreZeroed) = pattern[patternIndex];
+                // But we also have to back up the segment index
+                segmentIndex--;
+            }
+            // Do a last update of the available segment map
+            UpdateAvailableSegmentMap(availableSegmentMap, ref availableSegmentRunStart, ref availableSegmentRunCount);
+
+            // Set the flags in the buffer group
+            return SetBlockUsedFlags(bufferGroup, segmentInUseFlags, segmentZeroFlags);
+            return (segmentsAvailable, availableSegmentMap);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Initializes a new instance of the <see cref="UsingMemorySegmentedBufferGroupWithUsedPatterns"/> class.
+        /// </summary>
+        /// <param name="xUnitTestOutputHelper">
+        /// The Xunit test output helper that can be used to output test messages
+        /// </param>
+        public UsingMemorySegmentedBufferGroupWithUsedPatterns (ITestOutputHelper xUnitTestOutputHelper) : base(xUnitTestOutputHelper)
+        {
+        }
+        //--------------------------------------------------------------------------------
+
+        #region Test Methods
+
+        //================================================================================
+
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get a single segment zeroed buffer when the current used pattern is 
+        /// every other segment is in use (1-0) starting with the first segment.
+        /// This should return a buffer from the second segment in the group that is zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetSingleBuffer_WithAlternating_1_0_UsedSegments_GetsProperBuffer ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
+            SetSegmentInUsePattern(sut, skipCount: 0, (inUseCount: 1, availableCount: 1, availableAreZeroed: false));
+            int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+
+            // We'll always request a zeroed buffer for these tests
+            (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestBufferSize, true, bufferPool);
+
+            // We should get the second segment in the group
+            result.Should().Be(GetBufferResult.Available);
+            buffer.Length.Should().Be(requestBufferSize);
+            buffer.SegmentCount.Should().Be(1);
+            buffer.IsAllZeroes().Should().BeTrue();
+            buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+            buffer.BufferInfo.SegmentId.Should().Be(1);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get a single segment zeroed buffer when the current used pattern is 
+        /// every other segment is in use (1-0) starting with the first segment.
+        /// This should return a buffer from the second segment in the group that is zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_LargeGroup_GetSingleBuffer_WithAlternating_1_0_UsedSegments_GetsProperBuffer ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 3);
+            SetSegmentInUsePattern(sut, skipCount: 0, (inUseCount: 1, availableCount: 1, availableAreZeroed: false));
+            int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+
+            // We'll always request a zeroed buffer for these tests
+            (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestBufferSize, true, bufferPool);
+
+            // We should get the second segment in the group
+            result.Should().Be(GetBufferResult.Available);
+            buffer.Length.Should().Be(requestBufferSize);
+            buffer.SegmentCount.Should().Be(1);
+            buffer.IsAllZeroes().Should().BeTrue();
+            buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+            buffer.BufferInfo.SegmentId.Should().Be(1);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get a single segment zeroed buffer when the current used pattern is 
+        /// every other segment is in use (1-0) starting with the second segment.
+        /// This should return a buffer from the first segment in the group that is zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetSingleBuffer_WithAlternating_1_0_Skip1_UsedSegments_GetsProperBuffer ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
+            SetSegmentInUsePattern(sut, skipCount: 1, (inUseCount: 1, availableCount: 1, availableAreZeroed: false));
+            int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+
+            // We'll always request a zeroed buffer for these tests
+            (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestBufferSize, true, bufferPool);
+
+            // We should get the second segment in the group
+            result.Should().Be(GetBufferResult.Available);
+            buffer.Length.Should().Be(requestBufferSize);
+            buffer.SegmentCount.Should().Be(1);
+            buffer.IsAllZeroes().Should().BeTrue();
+            buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+            buffer.BufferInfo.SegmentId.Should().Be(0);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get a single segment zeroed buffer when the current used pattern is 
+        /// every other segment is in use (1-0) starting with the second segment.
+        /// This should return a buffer from the first segment in the group that is zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_LargeGroup_GetSingleBuffer_WithAlternating_1_0_Skip1_UsedSegments_GetsProperBuffer ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 3);
+            SetSegmentInUsePattern(sut, skipCount: 1, (inUseCount: 1, availableCount: 1, availableAreZeroed: false));
+            int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+
+            // We'll always request a zeroed buffer for these tests
+            (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestBufferSize, true, bufferPool);
+
+            // We should get the second segment in the group
+            result.Should().Be(GetBufferResult.Available);
+            buffer.Length.Should().Be(requestBufferSize);
+            buffer.SegmentCount.Should().Be(1);
+            buffer.IsAllZeroes().Should().BeTrue();
+            buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+            buffer.BufferInfo.SegmentId.Should().Be(0);
+        }
+        //--------------------------------------------------------------------------------    
+
+        #region Get Any Remaining Buffers Tests
+
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// every other segment is in use (1-0) starting with the first segment.
+        /// This should return a series of single segment buffers from every other segment in the group that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetRemainingBuffers_WithAlternating_1_0_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) =
+                SetSegmentInUsePattern(sut, skipCount: 0, (inUseCount: 1, availableCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Try to get all the available segments, we should get one segment back each time
+            int expectedSegmentId = 1;
+            while (availableSegments-- > 0)
+            {
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestBufferSize, true, bufferPool);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize);
+                buffer.SegmentCount.Should().Be(1);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                // Skip one segment for the next test
+                expectedSegmentId += 2;
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// every other segment is in use (1-0) starting with the first segment.
+        /// This should return a series of single segment buffers from every other segment in the group that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_LargeGroup_GetRemainingBuffers_WithAlternating_1_0_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 3);
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) =
+                SetSegmentInUsePattern(sut, skipCount: 0, (inUseCount: 1, availableCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Try to get all the available segments, we should get one segment back each time
+            int expectedSegmentId = 1;
+            while (availableSegments-- > 0)
+            {
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestBufferSize, true, bufferPool);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize);
+                buffer.SegmentCount.Should().Be(1);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                // Skip one segment for the next test
+                expectedSegmentId += 2;
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// every other segment is in use (0-1) starting with the first segment.
+        /// This should return a series of single segment buffers from every other segment in the group that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetRemainingBuffers_WithAlternating_1_0_Skip1_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) =
+                SetSegmentInUsePattern(sut, skipCount: 1, (inUseCount: 1, availableCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Try to get all the available segments, we should get one segment back each time
+            int expectedSegmentId = 0;
+            while (availableSegments-- > 0)
+            {
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestBufferSize, true, bufferPool);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize);
+                buffer.SegmentCount.Should().Be(1);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                // Skip one segment for the next test
+                expectedSegmentId += 2;
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// every other segment is in use (0-1) starting with the first segment.
+        /// This should return a series of single segment buffers from every other segment in the group that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_LargeGroup_GetRemainingBuffers_WithAlternating_1_0_Skip1_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 3);
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) =
+                SetSegmentInUsePattern(sut, skipCount: 1, (inUseCount: 1, availableCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Try to get all the available segments, we should get one segment back each time
+            int expectedSegmentId = 0;
+            while (availableSegments-- > 0)
+            {
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestBufferSize, true, bufferPool);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize);
+                buffer.SegmentCount.Should().Be(1);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                // Skip one segment for the next test
+                expectedSegmentId += 2;
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// (1-0-1-1-0) starting with the first segment.
+        /// This should return a series of repeating single segment buffers from the second and fifth segments in the group that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetRemainingBuffers_WithAlternating_1_0_1_1_0_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 3);
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) = SetSegmentInUsePattern(sut, skipCount: 0,
+                (inUseCount: 1, availableCount: 1, availableAreZeroed: false), (inUseCount: 2, availableCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Try to get all the available segments, we should get one segment back each time
+            int expectedSegmentId = 1;
+            // We skip 2 first because the first segment is in use
+            int usedSegmentSkip = 2;
+            while (availableSegments-- > 0)
+            {
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestBufferSize, true, bufferPool);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.SegmentCount.Should().Be(1);
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                // Skip one segment for the next test
+                expectedSegmentId += 1 + usedSegmentSkip;
+                usedSegmentSkip = (usedSegmentSkip == 2) ? 1 : 2;
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// (1-0-1-1-0) starting with the second segment.
+        /// This should return a series of repeating single segment buffers from the second and fifth segments in the group that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetRemainingBuffers_WithAlternating_1_0_1_1_0_Skip1_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 3);
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) = SetSegmentInUsePattern(sut, skipCount: 1,
+                (inUseCount: 1, availableCount: 1, availableAreZeroed: false), (inUseCount: 2, availableCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Try to get all the available segments, we should get one segment back each time
+            int expectedSegmentId = 0;
+            // We skip 1 first because the first segment is available
+            int usedSegmentSkip = 1;
+            while (availableSegments-- > 0)
+            {
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestBufferSize, true, bufferPool);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.SegmentCount.Should().Be(1);
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                // Skip one segment for the next test
+                expectedSegmentId += 1 + usedSegmentSkip;
+                usedSegmentSkip = (usedSegmentSkip == 2) ? 1 : 2;
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// (0-1-0-0-1) starting with the first segment.
+        /// This should return a series of repeating segment buffers based on the pattern that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetRemainingBuffers_WithAlternating_0_1_0_0_1_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 3);
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) = SetSegmentAvailablePattern(sut, skipCount: 0,
+                (availableCount: 1, inUseCount: 1, availableAreZeroed: false), (availableCount: 2, inUseCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Walk through the available segments based on the size of those segments - we expect to get the larger segment groups first
+            IEnumerator<KeyValuePair<int, List<int>>> availableSegmentSizeEnumerator = availableSegmentMap
+                .OrderByDescending(kvp => kvp.Key)
+                .GetEnumerator();
+            availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+
+            // The index of the current segment size offset in the available segment map
+            int availableSegmentSizeOffsetIndex = 0;
+
+            // Try to get all the available segments
+            while (availableSegments > 0)
+            {
+                // Check if we need to move to the next segment size
+                while (availableSegmentSizeOffsetIndex >= availableSegmentSizeEnumerator.Current.Value.Count)
+                {
+                    availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+                    availableSegmentSizeOffsetIndex = 0;
+                }
+                int expectedSegmentCount = availableSegmentSizeEnumerator.Current.Key;
+                int expectedSegmentId = availableSegmentSizeEnumerator.Current.Value[availableSegmentSizeOffsetIndex++];
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestBufferSize, true, bufferPool);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.SegmentCount.Should().Be(expectedSegmentCount);
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize * buffer.SegmentCount);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                availableSegments -= buffer.SegmentCount;
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// (0-1-0-0-1) starting with the second segment.
+        /// This should return a series of repeating segment buffers based on the pattern that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetRemainingBuffers_WithAlternating_0_1_0_0_1_Skip1_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 3);
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) = SetSegmentAvailablePattern(sut, skipCount: 1,
+                (availableCount: 1, inUseCount: 1, availableAreZeroed: false), (availableCount: 2, inUseCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Walk through the available segments based on the size of those segments - we expect to get the larger segment groups first
+            IEnumerator<KeyValuePair<int, List<int>>> availableSegmentSizeEnumerator = availableSegmentMap
+                .OrderByDescending(kvp => kvp.Key)
+                .GetEnumerator();
+            availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+
+            // The index of the current segment size offset in the available segment map
+            int availableSegmentSizeOffsetIndex = 0;
+
+            // Try to get all the available segments
+            while (availableSegments > 0)
+            {
+                // Check if we need to move to the next segment size
+                while (availableSegmentSizeOffsetIndex >= availableSegmentSizeEnumerator.Current.Value.Count)
+                {
+                    availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+                    availableSegmentSizeOffsetIndex = 0;
+                }
+                int expectedSegmentCount = availableSegmentSizeEnumerator.Current.Key;
+                int expectedSegmentId = availableSegmentSizeEnumerator.Current.Value[availableSegmentSizeOffsetIndex++];
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestBufferSize, true, bufferPool);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.SegmentCount.Should().Be(expectedSegmentCount);
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize * buffer.SegmentCount);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                availableSegments -= buffer.SegmentCount;
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is randomly generated.
+        /// This should return a series of repeating segment buffers based on the pattern that are zeroed.
+        /// </summary>
+        [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.LongRun)]
+        public void UsingMemorySegmentedBufferGroup_GetRemainingBuffers_WithRandomUsedPatterns_GetsProperBuffers ()
+        {
+            for (int testLoop = 0; testLoop < 1000; testLoop++)
+            {
+                (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 5);
+                int useSkipCount = GetTestInteger(0, 7);
+                int patternCount = GetTestInteger(1, 5);
+                bool useAvailablePattern = RandomSource.GetRandomBoolean();
+                TestWriteLine($"Test Loop: {testLoop} - Skip: {useSkipCount}, {(useAvailablePattern ? "Available" : "Used")} Patterns: {patternCount}");
+
+                int availableSegments;
+                Dictionary<int, List<int>> availableSegmentMap;
+                if (useAvailablePattern)
+                {
+                    (int availableCount, int inUseCount, bool availableAreZeroed)[] pattern = new (int, int, bool)[patternCount];
+                    for (int patternIndex = 0; patternIndex < patternCount; patternIndex++)
+                    {
+                        pattern[patternIndex] = (GetTestInteger(1, 12), GetTestInteger(1, 12), false);
+                        TestWriteLine($"    Available: {pattern[patternIndex].availableCount}, Used: {pattern[patternIndex].inUseCount}");
+                    }
+                    (availableSegments, availableSegmentMap) = SetSegmentAvailablePattern(sut, skipCount: useSkipCount, pattern);
+                }
+                else
+                {
+                    (int inUseCount, int availableCount, bool availableAreZeroed)[] pattern = new (int, int, bool)[patternCount];
+                    for (int patternIndex = 0; patternIndex < patternCount; patternIndex++)
+                    {
+                        pattern[patternIndex] = (GetTestInteger(1, 12), GetTestInteger(1, 12), false);
+                        TestWriteLine($"    Used: {pattern[patternIndex].inUseCount}, Available: {pattern[patternIndex].availableCount}");
+                    }
+                    (availableSegments, availableSegmentMap) = SetSegmentInUsePattern(sut, skipCount: useSkipCount, pattern);
+                }
+
+                int expectedUsedSegments = sut.SegmentCount - availableSegments;
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+
+                // Walk through the available segments based on the size of those segments - we expect to get the larger segment groups first
+                IEnumerator<KeyValuePair<int, List<int>>> availableSegmentSizeEnumerator = availableSegmentMap
+                    .OrderByDescending(kvp => kvp.Key)
+                    .GetEnumerator();
+                availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+
+                // The index of the current segment size offset in the available segment map
+                int availableSegmentSizeOffsetIndex = 0;
+
+                // Try to get all the available segments
+                while (availableSegments > 0)
+                {
+                    try
+                    {
+                        // Check if we need to move to the next segment size
+                        while (availableSegmentSizeOffsetIndex >= availableSegmentSizeEnumerator.Current.Value.Count)
+                        {
+                            availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+                            availableSegmentSizeOffsetIndex = 0;
+                        }
+                        int expectedSegmentCount = availableSegmentSizeEnumerator.Current.Key;
+                        int expectedSegmentId = availableSegmentSizeEnumerator.Current.Value[availableSegmentSizeOffsetIndex++];
+                        int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                        // We'll always request a zeroed buffer for these tests
+                        (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestBufferSize, true, bufferPool);
+                        expectedUsedSegments += buffer.SegmentCount;
+
+                        // We should get the next available segment in the group
+                        result.Should().Be(GetBufferResult.Available);
+                        // We should only get one segment back
+                        buffer.SegmentCount.Should().Be(expectedSegmentCount);
+                        buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize * buffer.SegmentCount);
+                        GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                        availableSegments -= buffer.SegmentCount;
+                        buffer.IsAllZeroes().Should().BeTrue();
+                        buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                        buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+
+                    }
+                    catch
+                    {
+                        TestWriteLine($"** Exception thrown with {availableSegments} segments left to get");
+                        throw;
+                    }
+                }
+
+                // An attempt to get another buffer should fail with the group full
+                int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+                (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+                fullResult.Should().Be(GetBufferResult.GroupFull);
+            }
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is randomly generated.
+        /// This should return a series of repeating segment buffers based on the pattern that are zeroed.
+        /// </summary>
+        [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.LongRun)]
+        public void UsingMemorySegmentedBufferGroup_GetRemainingBuffers_WithRandomUsedBlockFlags_GetsProperBuffers ()
+        {
+            const int BlockFlagSetTestCount = 9;
+            for (int testLoop = 0; testLoop < 1000; testLoop++)
+            {
+                (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * BlockFlagSetTestCount);
+                ulong[] setUsedBlockFlags = Enumerable.Range(0, BlockFlagSetSize).Select(_ => GetTestUnsignedLongInteger()).ToArray();
+                ulong[] setZeroBlockFlags = Enumerable.Repeat(0, BlockFlagSetSize).Select(_ => 0UL).ToArray();
+
+                (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) = SetBlockUsedFlags(sut, setUsedBlockFlags, setZeroBlockFlags);
+
+                TestWriteLine($"Test Loop: {testLoop} - Used Block Flags: {string.Join(", ", setUsedBlockFlags.Select(flag => flag.ToString("X16")))} - Zero Block Flags: {{all cleared}}");
+
+                int expectedUsedSegments = sut.SegmentCount - availableSegments;
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+
+                // Walk through the available segments based on the size of those segments - we expect to get the larger segment groups first
+                IEnumerator<KeyValuePair<int, List<int>>> availableSegmentSizeEnumerator = availableSegmentMap
+                    .OrderByDescending(kvp => kvp.Key)
+                    .GetEnumerator();
+                availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+
+                // The index of the current segment size offset in the available segment map
+                int availableSegmentSizeOffsetIndex = 0;
+
+                // Try to get all the available segments
+                while (availableSegments > 0)
+                {
+                    try
+                    {
+                        // Check if we need to move to the next segment size
+                        while (availableSegmentSizeOffsetIndex >= availableSegmentSizeEnumerator.Current.Value.Count)
+                        {
+                            availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+                            availableSegmentSizeOffsetIndex = 0;
+                        }
+                        int expectedSegmentCount = availableSegmentSizeEnumerator.Current.Key;
+                        int expectedSegmentId = availableSegmentSizeEnumerator.Current.Value[availableSegmentSizeOffsetIndex++];
+                        int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                        // We'll always request a zeroed buffer for these tests
+                        (SegmentBuffer buffer, GetBufferResult result) = sut.GetBuffer(requestBufferSize, true, bufferPool);
+                        expectedUsedSegments += buffer.SegmentCount;
+
+                        // We should get the next available segment in the group
+                        result.Should().Be(GetBufferResult.Available);
+                        // We should only get one segment back
+                        buffer.SegmentCount.Should().Be(expectedSegmentCount);
+                        buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize * buffer.SegmentCount);
+                        GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                        availableSegments -= buffer.SegmentCount;
+                        buffer.IsAllZeroes().Should().BeTrue();
+                        buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                        buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                    }
+                    catch
+                    {
+                        TestWriteLine($"** Exception thrown with {availableSegments} segments left to get");
+                        throw;
+                    }
+                }
+
+                // An attempt to get another buffer should fail with the group full
+                int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+                (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+                fullResult.Should().Be(GetBufferResult.GroupFull);
+            }
+        }
+        //--------------------------------------------------------------------------------    
+
+        #endregion Get Any Remaining Buffers Tests
+
+        #region Get Preferred Remaining Buffers Tests
+
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// every other segment is in use (1-0) starting with the first segment.
+        /// This should return a series of single segment buffers from every other segment in the group that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetPreferredRemainingBuffers_WithAlternating_1_0_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) =
+                SetSegmentInUsePattern(sut, skipCount: 0, (inUseCount: 1, availableCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Try to get all the available segments, we should get one segment back each time
+            int expectedSegmentId = 1;
+            int preferredSegmentId = -1;
+            while (availableSegments-- > 0)
+            {
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result, bool bufferSegmentIsPreferred) =
+                    sut.GetBuffer(requestBufferSize, true, bufferPool, preferredSegmentId);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group (NOT @ the preferred segment offset)
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize);
+                buffer.SegmentCount.Should().Be(1);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                // With this pattern, we will never get the preferred segment
+                bufferSegmentIsPreferred.Should().BeFalse();
+                preferredSegmentId = expectedSegmentId + 1;
+                // Skip one segment for the next test
+                expectedSegmentId += 2;
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// every other segment is in use (1-0) starting with the first segment.
+        /// This should return a series of single segment buffers from every other segment in the group that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_LargeGroup_GetPreferredRemainingBuffers_WithAlternating_1_0_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 3);
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) =
+                SetSegmentInUsePattern(sut, skipCount: 0, (inUseCount: 1, availableCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Try to get all the available segments, we should get one segment back each time
+            int expectedSegmentId = 1;
+            int preferredSegmentId = -1;
+            while (availableSegments-- > 0)
+            {
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result, bool bufferSegmentIsPreferred) =
+                    sut.GetBuffer(requestBufferSize, true, bufferPool, preferredSegmentId);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group (NOT @ the preferred segment offset)
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize);
+                buffer.SegmentCount.Should().Be(1);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                // With this pattern, we will never get the preferred segment
+                bufferSegmentIsPreferred.Should().BeFalse();
+                preferredSegmentId = expectedSegmentId + 1;
+                // Skip one segment for the next test
+                expectedSegmentId += 2;
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// every other segment is in use (0-1) starting with the first segment.
+        /// This should return a series of single segment buffers from every other segment in the group that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetPreferredRemainingBuffers_WithAlternating_1_0_Skip1_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool();
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) =
+                SetSegmentInUsePattern(sut, skipCount: 1, (inUseCount: 1, availableCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Try to get all the available segments, we should get one segment back each time
+            int expectedSegmentId = 0;
+            int preferredSegmentId = -1;
+            while (availableSegments-- > 0)
+            {
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result, bool bufferSegmentIsPreferred) =
+                    sut.GetBuffer(requestBufferSize, true, bufferPool, preferredSegmentId);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group (NOT @ the preferred segment offset)
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize);
+                buffer.SegmentCount.Should().Be(1);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                // With this pattern, we will never get the preferred segment
+                bufferSegmentIsPreferred.Should().BeFalse();
+                preferredSegmentId = expectedSegmentId + 1;
+                // Skip one segment for the next test
+                expectedSegmentId += 2;
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// every other segment is in use (0-1) starting with the second segment.
+        /// This should return a series of single segment buffers from every other segment in the group that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_LargeGroup_GetPreferredRemainingBuffers_WithAlternating_1_0_Skip1_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 3);
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) =
+                SetSegmentInUsePattern(sut, skipCount: 1, (inUseCount: 1, availableCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Try to get all the available segments, we should get one segment back each time
+            int expectedSegmentId = 0;
+            int preferredSegmentId = -1;
+            while (availableSegments-- > 0)
+            {
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result, bool bufferSegmentIsPreferred) =
+                    sut.GetBuffer(requestBufferSize, true, bufferPool, preferredSegmentId);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group (NOT @ the preferred segment offset)
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize);
+                buffer.SegmentCount.Should().Be(1);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                // With this pattern, we will never get the preferred segment
+                bufferSegmentIsPreferred.Should().BeFalse();
+                preferredSegmentId = expectedSegmentId + 1;
+                // Skip one segment for the next test
+                expectedSegmentId += 2;
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// (1-0-1-1-0) starting with the first segment.
+        /// This should return a series of repeating single segment buffers from the second and fifth segments in the group that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetPreferredRemainingBuffers_WithAlternating_1_0_1_1_0_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 3);
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) = SetSegmentInUsePattern(sut, skipCount: 0,
+                (inUseCount: 1, availableCount: 1, availableAreZeroed: false), (inUseCount: 2, availableCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Try to get all the available segments, we should get one segment back each time
+            int expectedSegmentId = 1;
+            // We skip 2 first because the first segment is in use
+            int usedSegmentSkip = 2;
+            int preferredSegmentId = -1;
+            while (availableSegments-- > 0)
+            {
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result, bool bufferSegmentIsPreferred) =
+                    sut.GetBuffer(requestBufferSize, true, bufferPool, preferredSegmentId);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group (NOT @ the preferred segment offset)
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.SegmentCount.Should().Be(1);
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                // Skip one segment for the next test
+                // With this pattern, we will never get the preferred segment
+                bufferSegmentIsPreferred.Should().BeFalse();
+                preferredSegmentId = expectedSegmentId + 1;
+                expectedSegmentId += 1 + usedSegmentSkip;
+                usedSegmentSkip = (usedSegmentSkip == 2) ? 1 : 2;
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// (1-0-1-1-0) starting with the second segment.
+        /// This should return a series of repeating single segment buffers from the second and fifth segments in the group that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetPreferredRemainingBuffers_WithAlternating_1_0_1_1_0_Skip1_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 3);
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) = SetSegmentInUsePattern(sut, skipCount: 1,
+                (inUseCount: 1, availableCount: 1, availableAreZeroed: false), (inUseCount: 2, availableCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Try to get all the available segments, we should get one segment back each time
+            int expectedSegmentId = 0;
+            // We skip 1 first because the first segment is available
+            int usedSegmentSkip = 1;
+            int preferredSegmentId = -1;
+            while (availableSegments-- > 0)
+            {
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result, bool bufferSegmentIsPreferred) =
+                    sut.GetBuffer(requestBufferSize, true, bufferPool, preferredSegmentId);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group (NOT @ the preferred segment offset)
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.SegmentCount.Should().Be(1);
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                // With this pattern, we will never get the preferred segment
+                bufferSegmentIsPreferred.Should().BeFalse();
+                preferredSegmentId = expectedSegmentId + 1;
+                // Skip one segment for the next test
+                expectedSegmentId += 1 + usedSegmentSkip;
+                usedSegmentSkip = (usedSegmentSkip == 2) ? 1 : 2;
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// (0-1-0-0-1) starting with the first segment.
+        /// This should return a series of repeating segment buffers based on the pattern that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetPreferredRemainingBuffers_WithAlternating_0_1_0_0_1_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 3);
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) = SetSegmentAvailablePattern(sut, skipCount: 0,
+                (availableCount: 1, inUseCount: 1, availableAreZeroed: false), (availableCount: 2, inUseCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Walk through the available segments based on the size of those segments - we expect to get the larger segment groups first
+            IEnumerator<KeyValuePair<int, List<int>>> availableSegmentSizeEnumerator = availableSegmentMap
+                .OrderByDescending(kvp => kvp.Key)
+                .GetEnumerator();
+            availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+
+            // The index of the current segment size offset in the available segment map
+            int availableSegmentSizeOffsetIndex = 0;
+            int preferredSegmentId = -1;
+
+            // Try to get all the available segments
+            while (availableSegments > 0)
+            {
+                // Check if we need to move to the next segment size
+                while (availableSegmentSizeOffsetIndex >= availableSegmentSizeEnumerator.Current.Value.Count)
+                {
+                    availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+                    availableSegmentSizeOffsetIndex = 0;
+                }
+                int expectedSegmentCount = availableSegmentSizeEnumerator.Current.Key;
+                int expectedSegmentId = availableSegmentSizeEnumerator.Current.Value[availableSegmentSizeOffsetIndex++];
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result, bool bufferSegmentIsPreferred) =
+                    sut.GetBuffer(requestBufferSize, true, bufferPool, preferredSegmentId);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group (NOT @ the preferred segment offset)
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.SegmentCount.Should().Be(expectedSegmentCount);
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize * buffer.SegmentCount);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                availableSegments -= buffer.SegmentCount;
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                // With this pattern, we will never get the preferred segment
+                bufferSegmentIsPreferred.Should().BeFalse();
+                preferredSegmentId = expectedSegmentId + expectedSegmentCount;
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is 
+        /// (0-1-0-0-1) starting with the second segment.
+        /// This should return a series of repeating segment buffers based on the pattern that are zeroed.
+        /// </summary>
+        [Fact]
+        public void UsingMemorySegmentedBufferGroup_GetPreferredRemainingBuffers_WithAlternating_0_1_0_0_1_Skip1_UsedSegments_GetsProperBuffers ()
+        {
+            (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 3);
+            (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) = SetSegmentAvailablePattern(sut, skipCount: 1,
+                (availableCount: 1, inUseCount: 1, availableAreZeroed: false), (availableCount: 2, inUseCount: 1, availableAreZeroed: false));
+            int expectedUsedSegments = sut.SegmentCount - availableSegments;
+
+            // Walk through the available segments based on the size of those segments - we expect to get the larger segment groups first
+            IEnumerator<KeyValuePair<int, List<int>>> availableSegmentSizeEnumerator = availableSegmentMap
+                .OrderByDescending(kvp => kvp.Key)
+                .GetEnumerator();
+            availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+
+            // The index of the current segment size offset in the available segment map
+            int availableSegmentSizeOffsetIndex = 0;
+            int preferredSegmentId = -1;
+
+            // Try to get all the available segments
+            while (availableSegments > 0)
+            {
+                // Check if we need to move to the next segment size
+                while (availableSegmentSizeOffsetIndex >= availableSegmentSizeEnumerator.Current.Value.Count)
+                {
+                    availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+                    availableSegmentSizeOffsetIndex = 0;
+                }
+                int expectedSegmentCount = availableSegmentSizeEnumerator.Current.Key;
+                int expectedSegmentId = availableSegmentSizeEnumerator.Current.Value[availableSegmentSizeOffsetIndex++];
+                int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                // We'll always request a zeroed buffer for these tests
+                (SegmentBuffer buffer, GetBufferResult result, bool bufferSegmentIsPreferred) =
+                    sut.GetBuffer(requestBufferSize, true, bufferPool, preferredSegmentId);
+                expectedUsedSegments += buffer.SegmentCount;
+
+                // We should get the next available segment in the group (NOT @ the preferred segment offset)
+                result.Should().Be(GetBufferResult.Available);
+                // We should only get one segment back
+                buffer.SegmentCount.Should().Be(expectedSegmentCount);
+                buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize * buffer.SegmentCount);
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                availableSegments -= buffer.SegmentCount;
+                buffer.IsAllZeroes().Should().BeTrue();
+                buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                // With this pattern, we will never get the preferred segment
+                bufferSegmentIsPreferred.Should().BeFalse();
+                preferredSegmentId = expectedSegmentId + expectedSegmentCount;
+            }
+
+            // An attempt to get another buffer should fail with the group full
+            int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+            (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+            fullResult.Should().Be(GetBufferResult.GroupFull);
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is randomly generated.
+        /// This should return a series of repeating segment buffers based on the pattern that are zeroed.
+        /// </summary>
+        [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.LongRun)]
+        public void UsingMemorySegmentedBufferGroup_GetPreferredRemainingBuffers_WithRandomUsedPatterns_GetsProperBuffers ()
+        {
+            for (int testLoop = 0; testLoop < 1000; testLoop++)
+            {
+                (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * 5);
+                int useSkipCount = GetTestInteger(0, 7);
+                int patternCount = GetTestInteger(1, 5);
+                bool useAvailablePattern = RandomSource.GetRandomBoolean();
+
+                TestWriteLine($"Test Loop: {testLoop} - Skip: {useSkipCount}, {(useAvailablePattern ? "Available" : "Used")} Patterns: {patternCount}");
+
+                int availableSegments;
+                Dictionary<int, List<int>> availableSegmentMap;
+                if (useAvailablePattern)
+                {
+                    (int availableCount, int inUseCount, bool availableAreZeroed)[] pattern = new (int, int, bool)[patternCount];
+                    for (int patternIndex = 0; patternIndex < patternCount; patternIndex++)
+                    {
+                        pattern[patternIndex] = (GetTestInteger(1, 12), GetTestInteger(1, 12), false);
+                        TestWriteLine($"    Available: {pattern[patternIndex].availableCount}, Used: {pattern[patternIndex].inUseCount}");
+                    }
+                    (availableSegments, availableSegmentMap) = SetSegmentAvailablePattern(sut, skipCount: useSkipCount, pattern);
+                }
+                else
+                {
+                    (int inUseCount, int availableCount, bool availableAreZeroed)[] pattern = new (int, int, bool)[patternCount];
+                    for (int patternIndex = 0; patternIndex < patternCount; patternIndex++)
+                    {
+                        pattern[patternIndex] = (GetTestInteger(1, 12), GetTestInteger(1, 12), false);
+                        TestWriteLine($"    Used: {pattern[patternIndex].inUseCount}, Available: {pattern[patternIndex].availableCount}");
+                    }
+                    (availableSegments, availableSegmentMap) = SetSegmentInUsePattern(sut, skipCount: useSkipCount, pattern);
+                }
+
+                int expectedUsedSegments = sut.SegmentCount - availableSegments;
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+
+                // Walk through the available segments based on the size of those segments - we expect to get the larger segment groups first
+                IEnumerator<KeyValuePair<int, List<int>>> availableSegmentSizeEnumerator = availableSegmentMap
+                    .OrderByDescending(kvp => kvp.Key)
+                    .GetEnumerator();
+                availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+
+                // The index of the current segment size offset in the available segment map
+                int availableSegmentSizeOffsetIndex = 0;
+                int preferredSegmentId = -1;
+
+                // Try to get all the available segments
+                while (availableSegments > 0)
+                {
+                    try
+                    {
+                        // Check if we need to move to the next segment size
+                        while (availableSegmentSizeOffsetIndex >= availableSegmentSizeEnumerator.Current.Value.Count)
+                        {
+                            availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+                            availableSegmentSizeOffsetIndex = 0;
+                        }
+                        int expectedSegmentCount = availableSegmentSizeEnumerator.Current.Key;
+                        int expectedSegmentId = availableSegmentSizeEnumerator.Current.Value[availableSegmentSizeOffsetIndex++];
+                        int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                        // We'll always request a zeroed buffer for these tests
+                        (SegmentBuffer buffer, GetBufferResult result, bool bufferSegmentIsPreferred) =
+                            sut.GetBuffer(requestBufferSize, true, bufferPool, preferredSegmentId);
+                        expectedUsedSegments += buffer.SegmentCount;
+
+                        // We should get the next available segment in the group (NOT @ the preferred segment offset)
+                        result.Should().Be(GetBufferResult.Available);
+                        // We should only get one segment back
+                        buffer.SegmentCount.Should().Be(expectedSegmentCount);
+                        buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize * buffer.SegmentCount);
+                        GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                        availableSegments -= buffer.SegmentCount;
+                        buffer.IsAllZeroes().Should().BeTrue();
+                        buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                        buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                        // Since we are always asking for the maximum segments available, we will never get the preferred segment
+                        bufferSegmentIsPreferred.Should().BeFalse();
+                        preferredSegmentId = expectedSegmentId + expectedSegmentCount;
+                    }
+                    catch
+                    {
+                        TestWriteLine($"** Exception thrown with {availableSegments} segments left to get");
+                        throw;
+                    }
+                }
+
+                // An attempt to get another buffer should fail with the group full
+                int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+                (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+                fullResult.Should().Be(GetBufferResult.GroupFull);
+            }
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get the available buffers when the current used pattern is randomly generated.
+        /// This should return a series of repeating segment buffers based on the pattern that are zeroed.
+        /// </summary>
+        [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.LongRun)]
+        public void UsingMemorySegmentedBufferGroup_GetPreferredRemainingBuffers_WithRandomUsedBlockFlags_GetsProperBuffers ()
+        {
+            const int BlockFlagSetTestCount = 9;
+            for (int testLoop = 0; testLoop < 1000; testLoop++)
+            {
+                (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * BlockFlagSetTestCount);
+                ulong[] setUsedBlockFlags = Enumerable.Range(0, BlockFlagSetSize).Select(_ => GetTestUnsignedLongInteger()).ToArray();
+                ulong[] setZeroBlockFlags = Enumerable.Repeat(0, BlockFlagSetSize).Select(_ => 0UL).ToArray();
+
+                (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) = SetBlockUsedFlags(sut, setUsedBlockFlags, setZeroBlockFlags);
+
+                TestWriteLine($"Test Loop: {testLoop} - Used Block Flags: {string.Join(", ", setUsedBlockFlags.Select(flag => flag.ToString("X16")))} - Zero Block Flags: {{all cleared}}");
+
+                int expectedUsedSegments = sut.SegmentCount - availableSegments;
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+
+                // Walk through the available segments based on the size of those segments - we expect to get the larger segment groups first
+                IEnumerator<KeyValuePair<int, List<int>>> availableSegmentSizeEnumerator = availableSegmentMap
+                    .OrderByDescending(kvp => kvp.Key)
+                    .GetEnumerator();
+                availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+
+                // The index of the current segment size offset in the available segment map
+                int availableSegmentSizeOffsetIndex = 0;
+                int preferredSegmentId = -1;
+
+                // Try to get all the available segments
+                while (availableSegments > 0)
+                {
+                    try
+                    {
+                        // Check if we need to move to the next segment size
+                        while (availableSegmentSizeOffsetIndex >= availableSegmentSizeEnumerator.Current.Value.Count)
+                        {
+                            availableSegmentSizeEnumerator.MoveNext().Should().BeTrue();
+                            availableSegmentSizeOffsetIndex = 0;
+                        }
+                        int expectedSegmentCount = availableSegmentSizeEnumerator.Current.Key;
+                        int expectedSegmentId = availableSegmentSizeEnumerator.Current.Value[availableSegmentSizeOffsetIndex++];
+                        int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * (availableSegments + 1);
+
+                        // We'll always request a zeroed buffer for these tests
+                        (SegmentBuffer buffer, GetBufferResult result, bool bufferSegmentIsPreferred) =
+                            sut.GetBuffer(requestBufferSize, true, bufferPool, preferredSegmentId);
+                        expectedUsedSegments += buffer.SegmentCount;
+
+                        // We should get the next available segment in the group (NOT @ the preferred segment offset)
+                        result.Should().Be(GetBufferResult.Available);
+                        // We should only get one segment back
+                        buffer.SegmentCount.Should().Be(expectedSegmentCount);
+                        buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize * buffer.SegmentCount);
+                        GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                        availableSegments -= buffer.SegmentCount;
+                        buffer.IsAllZeroes().Should().BeTrue();
+                        buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+                        buffer.BufferInfo.SegmentId.Should().Be(expectedSegmentId);
+                        // Since we are always asking for the maximum segments available, we will never get the preferred segment
+                        bufferSegmentIsPreferred.Should().BeFalse();
+                        preferredSegmentId = expectedSegmentId + expectedSegmentCount;
+                    }
+                    catch
+                    {
+                        TestWriteLine($"** Exception thrown with {availableSegments} segments left to get");
+                        throw;
+                    }
+                }
+
+                // An attempt to get another buffer should fail with the group full
+                int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+                (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+                fullResult.Should().Be(GetBufferResult.GroupFull);
+            }
+        }
+        //--------------------------------------------------------------------------------    
+
+        #endregion Get Preferred Remaining Buffers Tests
+
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get random buffers when the current used pattern is randomly generated.
+        /// </summary>
+        [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.LongRun)]
+        public void UsingMemorySegmentedBufferGroup_GetRandomBuffers_WithRandomUsedBlockFlags_GetsProperBuffers ()
+        {
+            const int BlockFlagSetTestCount = 9;
+            for (int testLoop = 0; testLoop < 1000; testLoop++)
+            {
+                (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * BlockFlagSetTestCount);
+                ulong[] setUsedBlockFlags = Enumerable.Range(0, BlockFlagSetSize).Select(_ => GetTestUnsignedLongInteger()).ToArray();
+                ulong[] setZeroBlockFlags = Enumerable.Repeat(0, BlockFlagSetSize).Select(_ => 0UL).ToArray();
+
+                (int availableSegments, Dictionary<int, List<int>> availableSegmentMap) = SetBlockUsedFlags(sut, setUsedBlockFlags, setZeroBlockFlags);
+
+                TestWriteLine($"Test Loop: {testLoop} - Used Block Flags: {string.Join(", ", setUsedBlockFlags.Select(flag => flag.ToString("X16")))} - Zero Block Flags: {{all cleared}}");
+
+                int expectedUsedSegments = sut.SegmentCount - availableSegments;
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+
+                int preferredSegmentId = -1;
+
+                // Randomly get buffers until we can't get any more segments
+                while (availableSegments > 0)
+                {
+                    try
+                    {
+                        int requestSegmentCount = GetTestInteger(1, Math.Min(9, availableSegments) + 1);
+                        int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * requestSegmentCount;
+
+                        // We'll always request a zeroed buffer for these tests
+                        (SegmentBuffer buffer, GetBufferResult result, bool bufferSegmentIsPreferred) =
+                            sut.GetBuffer(requestBufferSize, true, bufferPool, preferredSegmentId);
+                        // Be sure we got the buffer
+                        result.Should().Be(GetBufferResult.Available);
+
+                        expectedUsedSegments += buffer.SegmentCount;
+                        availableSegments -= buffer.SegmentCount;
+                        // Check the number of segments returned
+                        buffer.SegmentCount.Should().BeLessThanOrEqualTo(requestSegmentCount);
+                        buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize * buffer.SegmentCount);
+                        GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                        buffer.IsAllZeroes().Should().BeTrue();
+                        buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+
+                        // Check if we got the preferred segment
+                        if (preferredSegmentId >= 0)
+                            bufferSegmentIsPreferred.Should().Be(preferredSegmentId == buffer.BufferInfo.SegmentId);
+                        else
+                            bufferSegmentIsPreferred.Should().BeFalse();
+
+                        // If this is a preferred segment, the entry could come from anywhere
+                        // in the available segment map, so we can't rely on it coming from
+                        // the first entry in the map for a given segment size.
+                        (KeyValuePair<int, List<int>> segmentSizeEntry, int segmentSizeListIndex) =
+                            bufferSegmentIsPreferred ?
+                                availableSegmentMap
+                                    .Select(kvp => (mapEntry: kvp, segmentIndex: kvp.Value.IndexOf(buffer.BufferInfo.SegmentId)))
+                                    .FirstOrDefault(kvp => kvp.segmentIndex >= 0) :
+                                (availableSegmentMap
+                                .FirstOrDefault(kvp => kvp.Value[0] == buffer.BufferInfo.SegmentId), 0);
+                        // Make sure we found the segment size entry
+                        segmentSizeEntry.Should().NotBe(default(KeyValuePair<int, List<int>>));
+
+                        // Make sure the segment was gotten from a properly sized segment group
+                        buffer.SegmentCount.Should().BeLessThanOrEqualTo(segmentSizeEntry.Key);
+                        // Reset preferred segment for the next test but we may set it later
+                        // THIS MUST STAY HERE - we need to reset the preferred segment ID
+                        // after we check the buffer segment is preferred above
+                        preferredSegmentId = -1;
+
+                        segmentSizeEntry.Value.RemoveAt(segmentSizeListIndex);
+                        // If there are no more entries in the list, remove the entry
+                        if (0 == segmentSizeEntry.Value.Count)
+                            availableSegmentMap.Remove(segmentSizeEntry.Key);
+                        // If we found the exact size for the available map, then we can just continue
+                        if (segmentSizeEntry.Key == buffer.SegmentCount)
+                        {
+                            continue;
+                        }
+                        // The segment size was smaller than the available space in this group, so 
+                        // adjust the available map.
+                        int remainingGroupSegments = segmentSizeEntry.Key - buffer.SegmentCount;
+                        // Set the preferred segment ID to the next segment after the one we just got
+                        // for the next loop
+                        preferredSegmentId = buffer.BufferInfo.SegmentId + buffer.SegmentCount;
+                        if (availableSegmentMap.ContainsKey(remainingGroupSegments))
+                        {
+                            availableSegmentMap[remainingGroupSegments].Add(preferredSegmentId);
+                            availableSegmentMap[remainingGroupSegments].Sort();
+                            continue;
+                        }
+                        availableSegmentMap[remainingGroupSegments] = [preferredSegmentId];
+                    }
+                    catch
+                    {
+                        TestWriteLine($"** Exception thrown with {availableSegments} segments left to get");
+                        throw;
+                    }
+                }
+
+                // An attempt to get another buffer should fail with the group full
+                int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+                (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+                fullResult.Should().Be(GetBufferResult.GroupFull);
+            }
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests the <see cref="MemorySegmentedBufferGroup.GetBuffer(int, bool, MemorySegmentedBufferPool)"/> 
+        /// method to get random buffers when the current used pattern is randomly generated.
+        /// </summary>
+        [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.LongRun)]
+        public void UsingMemorySegmentedBufferGroup_GetRandomBuffers_WithRandomUsedPatterns_GetsProperBuffers ()
+        {
+            const int BlockFlagSetTestCount = 9;
+            for (int testLoop = 0; testLoop < 1000; testLoop++)
+            {
+                (MemorySegmentedBufferGroup sut, MemorySegmentedBufferPool bufferPool) = GetTestGroupAndPool(segmentCount: BlockFlagSetSize * BlockFlagSetTestCount);
+                int useSkipCount = GetTestInteger(0, 7);
+                int patternCount = GetTestInteger(1, 5);
+                bool useAvailablePattern = RandomSource.GetRandomBoolean();
+
+                TestWriteLine($"Test Loop: {testLoop} - Skip: {useSkipCount}, {(useAvailablePattern ? "Available" : "Used")} Patterns: {patternCount}");
+
+                int availableSegments;
+                Dictionary<int, List<int>> availableSegmentMap;
+                if (useAvailablePattern)
+                {
+                    (int availableCount, int inUseCount, bool availableAreZeroed)[] pattern = new (int, int, bool)[patternCount];
+                    for (int patternIndex = 0; patternIndex < patternCount; patternIndex++)
+                    {
+                        pattern[patternIndex] = (GetTestInteger(1, 12), GetTestInteger(1, 12), false);
+                        TestWriteLine($"    Available: {pattern[patternIndex].availableCount}, Used: {pattern[patternIndex].inUseCount}");
+                    }
+                    (availableSegments, availableSegmentMap) = SetSegmentAvailablePattern(sut, skipCount: useSkipCount, pattern);
+                }
+                else
+                {
+                    (int inUseCount, int availableCount, bool availableAreZeroed)[] pattern = new (int, int, bool)[patternCount];
+                    for (int patternIndex = 0; patternIndex < patternCount; patternIndex++)
+                    {
+                        pattern[patternIndex] = (GetTestInteger(1, 12), GetTestInteger(1, 12), false);
+                        TestWriteLine($"    Used: {pattern[patternIndex].inUseCount}, Available: {pattern[patternIndex].availableCount}");
+                    }
+                    (availableSegments, availableSegmentMap) = SetSegmentInUsePattern(sut, skipCount: useSkipCount, pattern);
+                }
+
+                int expectedUsedSegments = sut.SegmentCount - availableSegments;
+                GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+
+                int preferredSegmentId = -1;
+
+                // Randomly get buffers until we can't get any more segments
+                while (availableSegments > 0)
+                {
+                    try
+                    {
+                        int requestSegmentCount = GetTestInteger(1, Math.Min(9, availableSegments) + 1);
+                        int requestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize * requestSegmentCount;
+
+                        // We'll always request a zeroed buffer for these tests
+                        (SegmentBuffer buffer, GetBufferResult result, bool bufferSegmentIsPreferred) =
+                            sut.GetBuffer(requestBufferSize, true, bufferPool, preferredSegmentId);
+                        // Be sure we got the buffer
+                        result.Should().Be(GetBufferResult.Available);
+
+                        expectedUsedSegments += buffer.SegmentCount;
+                        availableSegments -= buffer.SegmentCount;
+                        // Check the number of segments returned
+                        buffer.SegmentCount.Should().BeLessThanOrEqualTo(requestSegmentCount);
+                        buffer.Length.Should().Be(MemorySegmentedBufferGroup.StandardBufferSegmentSize * buffer.SegmentCount);
+                        GetSegmentsInUse(sut).Should().Be(expectedUsedSegments);
+                        buffer.IsAllZeroes().Should().BeTrue();
+                        buffer.BufferInfo.BlockId.Should().Be(sut.Id);
+
+                        // Check if we got the preferred segment
+                        if (preferredSegmentId >= 0)
+                            bufferSegmentIsPreferred.Should().Be(preferredSegmentId == buffer.BufferInfo.SegmentId);
+                        else
+                            bufferSegmentIsPreferred.Should().BeFalse();
+
+                        // If this is a preferred segment, the entry could come from anywhere
+                        // in the available segment map, so we can't rely on it coming from
+                        // the first entry in the map for a given segment size.
+                        (KeyValuePair<int, List<int>> segmentSizeEntry, int segmentSizeListIndex) =
+                            bufferSegmentIsPreferred ?
+                                availableSegmentMap
+                                    .Select(kvp => (mapEntry: kvp, segmentIndex: kvp.Value.IndexOf(buffer.BufferInfo.SegmentId)))
+                                    .FirstOrDefault(kvp => kvp.segmentIndex >= 0) :
+                                (availableSegmentMap
+                                .FirstOrDefault(kvp => kvp.Value[0] == buffer.BufferInfo.SegmentId), 0);
+                        // Make sure we found the segment size entry
+                        segmentSizeEntry.Should().NotBe(default(KeyValuePair<int, List<int>>));
+
+                        // Make sure the segment was gotten from a properly sized segment group
+                        buffer.SegmentCount.Should().BeLessThanOrEqualTo(segmentSizeEntry.Key);
+                        // Reset preferred segment for the next test but we may set it later
+                        // THIS MUST STAY HERE - we need to reset the preferred segment ID
+                        // after we check the buffer segment is preferred above
+                        preferredSegmentId = -1;
+
+                        segmentSizeEntry.Value.RemoveAt(segmentSizeListIndex);
+                        // If there are no more entries in the list, remove the entry
+                        if (0 == segmentSizeEntry.Value.Count)
+                            availableSegmentMap.Remove(segmentSizeEntry.Key);
+                        // If we found the exact size for the available map, then we can just continue
+                        if (segmentSizeEntry.Key == buffer.SegmentCount)
+                        {
+                            continue;
+                        }
+                        // The segment size was smaller than the available space in this group, so 
+                        // adjust the available map.
+                        int remainingGroupSegments = segmentSizeEntry.Key - buffer.SegmentCount;
+                        // Set the preferred segment ID to the next segment after the one we just got
+                        // for the next loop
+                        preferredSegmentId = buffer.BufferInfo.SegmentId + buffer.SegmentCount;
+                        if (availableSegmentMap.ContainsKey(remainingGroupSegments))
+                        {
+                            availableSegmentMap[remainingGroupSegments].Add(preferredSegmentId);
+                            availableSegmentMap[remainingGroupSegments].Sort();
+                            continue;
+                        }
+                        availableSegmentMap[remainingGroupSegments] = [preferredSegmentId];
+                    }
+                    catch
+                    {
+                        TestWriteLine($"** Exception thrown with {availableSegments} segments left to get");
+                        throw;
+                    }
+                }
+
+                // An attempt to get another buffer should fail with the group full
+                int fullRequestBufferSize = MemorySegmentedBufferGroup.StandardBufferSegmentSize;
+                (SegmentBuffer _, GetBufferResult fullResult) = sut.GetBuffer(fullRequestBufferSize, true, bufferPool);
+                fullResult.Should().Be(GetBufferResult.GroupFull);
+            }
+        }
+        //--------------------------------------------------------------------------------    
+
+        //================================================================================
+
+        #endregion Test Methods
+    }
+}
diff --git a/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/UsingMemoryStreamSlim.cs b/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/UsingMemoryStreamSlim.cs
index cf5e9fe..5308f92 100644
--- a/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/UsingMemoryStreamSlim.cs
+++ b/Source/Tst/KZDev.PerfUtils.Memory.UnitTests/UsingMemoryStreamSlim.cs
@@ -16,7 +16,7 @@ namespace KZDev.PerfUtils.Tests
     /// Unit tests for the <see cref="MemoryStreamSlim"/> class.
     /// </summary>
     [Trait(TestConstants.TestTrait.Category, "Memory")]
-    public partial class UsingMemoryStreamSlim : UnitTestBase
+    public partial class UsingMemoryStreamSlim : UsingMemoryStreamSlimUnitTestBase
     {
         /// <summary>
         /// The size of the test read/write segments.
@@ -268,7 +268,6 @@ public void UsingMemoryStreamSlim_SetCapacity_CapacityPropertyIsCorrect ()
         /// to a value below the current length, which should throw an exception.
         /// </summary>
         [Fact]
-        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.MedRun)]
         public void UsingMemoryStreamSlim_SetCapacityToLength_SetsProperCapacity ()
         {
             const int maxTestCapacity = MemorySegmentedBufferGroup.StandardBufferSegmentSize * 64;
@@ -562,7 +561,7 @@ public void UsingMemoryStreamSlim_SetLengthLarger_SetsProperLength ()
         public void UsingMemoryStreamSlim_SetLengthLarger_FillsWithZeroedBytes ()
         {
             // Fill the stream with random bytes
-            for (int testLoop = 0; testLoop < 1000; testLoop++)
+            for (int testLoop = 0; testLoop < 5_000; testLoop++)
             {
                 using MemoryStreamSlim testService = MemoryStreamSlim.Create(options => options.ZeroBufferBehavior = MemoryStreamSlimZeroBufferOption.None);
                 int byteCount = RandomSource.GetRandomInteger(10, 0x2_0000);
@@ -570,7 +569,7 @@ public void UsingMemoryStreamSlim_SetLengthLarger_FillsWithZeroedBytes ()
                 int newLength = byteCount + addLength;
                 TestWriteLine($"Running test loop {testLoop} with byte count of {byteCount} and new length of {newLength}");
 
-                MemoryTestPrep.FillStreamAndArrayWithRandomBytes(testService, byteCount, 0x10000);
+                MemoryTestPrep.FillStreamWithRandomBytes(testService, byteCount, 0x10000);
 
                 // Change the length to a random value
                 testService.SetLength(newLength);
@@ -581,6 +580,60 @@ public void UsingMemoryStreamSlim_SetLengthLarger_FillsWithZeroedBytes ()
         }
         //--------------------------------------------------------------------------------    
         /// <summary>
+        /// Tests setting the Length property of a <see cref="MemoryStreamSlim"/> instance
+        /// to a value higher than the current length and verifying the filled space is zeroed.
+        /// The set to lengths are from a set of standard sizes
+        /// </summary>
+        [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.MedRun)]
+        public void UsingMemoryStreamSlim_SetLengthLargerUsingSizeIntervals_FillsWithZeroedBytes ()
+        {
+            int[] testLengths = [MemorySegmentedBufferGroup.StandardBufferSegmentSize / 4,
+                MemorySegmentedBufferGroup.StandardBufferSegmentSize / 2,
+                MemorySegmentedBufferGroup.StandardBufferSegmentSize,
+                (MemorySegmentedBufferGroup.StandardBufferSegmentSize / 2) * 3,
+                MemorySegmentedBufferGroup.StandardBufferSegmentSize * 2,
+                MemorySegmentedBufferGroup.StandardBufferSegmentSize * 3,
+                MemorySegmentedBufferGroup.StandardBufferSegmentSize * 4];
+            byte[] readCompareArray = new byte[testLengths.Max()];
+
+            // Test the full lengths
+            for (int sizeIndex = 0; sizeIndex < testLengths.Length; sizeIndex++)
+            {
+                int fullLength = testLengths[sizeIndex];
+                // Test initial write data sizes that are less than the current full length
+                for (int initialSize = 0xC00; initialSize < fullLength; initialSize += 0xC00)
+                {
+                    // Test pushing the position beyond the target length to different values
+                    for (int positionIndex = sizeIndex; positionIndex < testLengths.Length; positionIndex++)
+                    {
+                        int setPositionValue = testLengths[positionIndex];
+                        using MemoryStreamSlim testService = MemoryStreamSlim.Create(options => options.ZeroBufferBehavior = MemoryStreamSlimZeroBufferOption.None);
+                        int addLength = fullLength - initialSize;
+                        TestWriteLine($"Running test loop {sizeIndex} with byte count of {initialSize} and new length of {fullLength}");
+
+                        MemoryTestPrep.FillStreamWithRandomBytes(testService, initialSize, 0x1000);
+
+                        // Set the position of the stream
+                        testService.Position = setPositionValue;
+
+                        // Change the length to a random value
+                        testService.SetLength(fullLength);
+                        // Now set the position back in order to read the data which 
+                        // should have been filled in with zeros
+                        testService.Position = initialSize;
+                        Span<byte> readSpan = readCompareArray.AsSpan(0, addLength);
+                        testService.Read(readSpan).Should().Be(addLength);
+                        for (int byteIndex = 0; byteIndex < addLength; byteIndex++)
+                        {
+                            readSpan[byteIndex].Should().Be(0);
+                        }
+                    }
+                }
+            }
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
         /// Tests creating an instance MemoryStreamSlim as a dynamic sized stream and verifying 
         /// that calling GetBuffer throws an exception.
         /// </summary>
diff --git a/Source/Tst/KZDev.PerfUtils.TestBase/KZDev.PerfUtils.TestBase.csproj b/Source/Tst/KZDev.PerfUtils.TestBase/KZDev.PerfUtils.TestBase.csproj
index daafed6..d64fbe5 100644
--- a/Source/Tst/KZDev.PerfUtils.TestBase/KZDev.PerfUtils.TestBase.csproj
+++ b/Source/Tst/KZDev.PerfUtils.TestBase/KZDev.PerfUtils.TestBase.csproj
@@ -1,14 +1,14 @@
 <Project Sdk="Microsoft.NET.Sdk">
 	<ItemGroup>
-		<PackageReference Include="Bogus" Version="35.6.1" />
-		<PackageReference Include="FluentAssertions" Version="6.12.1" />
-		<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
-		<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
-		<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
-		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
-		<PackageReference Include="Moq" Version="4.20.72" />
-		<PackageReference Include="xunit" Version="2.9.2" />
-		<PackageReference Include="XunitXml.TestLogger" Version="4.0.254" />
+		<PackageReference Include="Bogus" Version="$(PerfUtils-Pkg-Bogus)" />
+		<PackageReference Include="FluentAssertions" Version="$(PerfUtils-Pkg-FluentAssertions)" />
+		<PackageReference Include="Microsoft.Extensions.Configuration" Version="$(PerfUtils-Pkg-Microsoft_Extensions_Configuration)" />
+		<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="$(PerfUtils-Pkg-Microsoft_Extensions_DependencyInjection)" />
+		<PackageReference Include="Microsoft.Extensions.Hosting" Version="$(PerfUtils-Pkg-Microsoft_Extensions_Hosting)" />
+		<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(PerfUtils-Pkg-Microsoft_NET_Test_Sdk)" />
+		<PackageReference Include="Moq" Version="$(PerfUtils-Pkg-Moq)" />
+		<PackageReference Include="xunit" Version="$(PerfUtils-Pkg-xunit)" />
+		<PackageReference Include="XunitXml.TestLogger" Version="$(PerfUtils-Pkg-XunitXml_TestLogger)" />
 	</ItemGroup>
 
 	<ItemGroup>
diff --git a/Source/Tst/KZDev.PerfUtils.TestBase/TestConstants.cs b/Source/Tst/KZDev.PerfUtils.TestBase/TestConstants.cs
index db436cb..48a005d 100644
--- a/Source/Tst/KZDev.PerfUtils.TestBase/TestConstants.cs
+++ b/Source/Tst/KZDev.PerfUtils.TestBase/TestConstants.cs
@@ -63,6 +63,22 @@ public static class TestModel
             public const string Concurrency = "Concurrency";
         }
         //================================================================================
+        /// <summary>
+        /// Constants for test category names.
+        /// </summary>
+        public static class TestCategory
+        {
+            /// <summary>
+            /// The Memory unit test category.
+            /// </summary>
+            public const string Memory = "Memory";
+
+            /// <summary>
+            /// The concurrency unit test category.
+            /// </summary>
+            public const string Concurrency = "Concurrency";
+        }
+        //================================================================================
     }
     //################################################################################
 }
diff --git a/Source/Tst/KZDev.PerfUtils.TestData/IRandomSource.cs b/Source/Tst/KZDev.PerfUtils.TestData/IRandomSource.cs
index a403741..3cd6067 100644
--- a/Source/Tst/KZDev.PerfUtils.TestData/IRandomSource.cs
+++ b/Source/Tst/KZDev.PerfUtils.TestData/IRandomSource.cs
@@ -33,6 +33,31 @@ public interface IRandomSource
         /// </returns>
         int GetRandomInteger (int minValue, int maxValue);
 
+        /// <summary>
+        /// Gets a random unsigned integer in the range of [0...maxValue)
+        /// </summary>
+        /// <param name="maxValue">
+        /// The maximum value that the random number can be.
+        /// </param>
+        /// <returns>
+        /// A random number between zero and the maximum values.
+        /// </returns>
+        uint GetRandomUnsignedInteger (uint maxValue);
+
+        /// <summary>
+        /// Gets a random unsigned integer in the range of [minValue...maxValue)
+        /// </summary>
+        /// <param name="minValue">
+        /// The minimum value that the random number can be.
+        /// </param>
+        /// <param name="maxValue">
+        /// The maximum value that the random number can be.
+        /// </param>
+        /// <returns>
+        /// A random number between the specified minimum and maximum values.
+        /// </returns>
+        uint GetRandomUnsignedInteger (uint minValue, uint maxValue);
+
         /// <summary>
         /// Gets a random long integer in the range of [0...maxValue)
         /// </summary>
@@ -42,7 +67,7 @@ public interface IRandomSource
         /// <returns>
         /// A random number between the zero and the maximum values.
         /// </returns>
-        long GetRandomInteger (long maxValue);
+        long GetRandomLongInteger (long maxValue);
 
         /// <summary>
         /// Gets a random long integer in the range of [minValue...maxValue)
@@ -58,6 +83,31 @@ public interface IRandomSource
         /// </returns>
         long GetRandomLongInteger (long minValue, long maxValue);
 
+        /// <summary>
+        /// Gets a random unsigned long integer in the range of [0...maxValue)
+        /// </summary>
+        /// <param name="maxValue">
+        /// The maximum value that the random number can be.
+        /// </param>
+        /// <returns>
+        /// A random number between the zero and the maximum values.
+        /// </returns>
+        ulong GetRandomUnsignedLongInteger (ulong maxValue);
+
+        /// <summary>
+        /// Gets a random unsigned long integer in the range of [minValue...maxValue)
+        /// </summary>
+        /// <param name="minValue">
+        /// The minimum value that the random number can be.
+        /// </param>
+        /// <param name="maxValue">
+        /// The maximum value that the random number can be.
+        /// </param>
+        /// <returns>
+        /// A random long integer between the specified minimum and maximum values.
+        /// </returns>
+        ulong GetRandomUnsignedLongInteger (ulong minValue, ulong maxValue);
+
         /// <summary>
         /// Gets a series of random bytes and fills the array with them.
         /// </summary>
diff --git a/Source/Tst/KZDev.PerfUtils.TestData/SecureRandomSource.cs b/Source/Tst/KZDev.PerfUtils.TestData/SecureRandomSource.cs
index a350297..a39dab1 100644
--- a/Source/Tst/KZDev.PerfUtils.TestData/SecureRandomSource.cs
+++ b/Source/Tst/KZDev.PerfUtils.TestData/SecureRandomSource.cs
@@ -1,6 +1,7 @@
 // Copyright (c) Kevin Zehrer
 // Licensed under the MIT License. See LICENSE file in the project root for full license information.
 
+using System.Runtime.CompilerServices;
 using System.Security.Cryptography;
 
 namespace KZDev.PerfUtils.Tests
@@ -46,6 +47,7 @@ internal class SecureRandomSource : IRandomSource
         /// <exception cref="ArgumentException">
         /// Thrown when the passed <paramref name="byteArray"/> is an invalid size.
         /// </exception>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         private static int InternalGetRandomBytes (byte[] byteArray, int byteCount = -1)
         {
             ArgumentNullException.ThrowIfNull(byteArray);
@@ -61,6 +63,7 @@ private static int InternalGetRandomBytes (byte[] byteArray, int byteCount = -1)
         /// in a truly random way.
         /// </summary>
         /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         private static int InternalGetRandomInteger ()
         {
             _randomIntegerBytes ??= new byte[sizeof(int)];
@@ -70,10 +73,25 @@ private static int InternalGetRandomInteger ()
         }
         //--------------------------------------------------------------------------------
         /// <summary>
+        /// Helper to generate a random unsigned integer from any range (uint.MinValue to uint.MaxValue)
+        /// in a truly random way.
+        /// </summary>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        private static uint InternalGetRandomUnsignedInteger ()
+        {
+            _randomIntegerBytes ??= new byte[sizeof(uint)];
+            Random.GetBytes(_randomIntegerBytes);
+            // convert 4 bytes to an integer 
+            return BitConverter.ToUInt32(_randomIntegerBytes, 0);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
         /// Helper to generate a random long integer from any range (long.MinValue to
         /// long.MaxValue) in a truly random way.
         /// </summary>
         /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         private static long InternalGetRandomLongInteger ()
         {
             _randomLongIntegerBytes ??= new byte[sizeof(long)];
@@ -82,6 +100,20 @@ private static long InternalGetRandomLongInteger ()
             return BitConverter.ToInt64(_randomLongIntegerBytes, 0);
         }
         //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Helper to generate a random unsigned long integer from any range (ulong.MinValue to
+        /// ulong.MaxValue) in a truly random way.
+        /// </summary>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        private static ulong InternalGetRandomUnsignedLongInteger ()
+        {
+            _randomLongIntegerBytes ??= new byte[sizeof(ulong)];
+            Random.GetBytes(_randomLongIntegerBytes);
+            // convert 8 bytes to a long integer 
+            return BitConverter.ToUInt64(_randomLongIntegerBytes, 0);
+        }
+        //--------------------------------------------------------------------------------
 
         //--------------------------------------------------------------------------------
         /// <summary>
@@ -119,6 +151,25 @@ private static int InternalGetRandomInteger (int minValue, int maxValue)
         }
         //--------------------------------------------------------------------------------
         /// <summary>
+        /// Internal helper to generate a random unsigned integer in the requested range.
+        /// </summary>
+        /// <param name="minValue">
+        /// The minimum value to return.
+        /// </param>
+        /// <param name="maxValue">
+        /// The maximum value to return.
+        /// </param>
+        /// <returns>
+        /// A random integer within the passed range of values.
+        /// </returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        private static uint InternalGetRandomUnsignedInteger (uint minValue, uint maxValue)
+        {
+            uint range = maxValue - minValue;
+            return minValue + (InternalGetRandomUnsignedInteger() % range);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
         /// Internal helper to generate a random long integer in the requested range.
         /// </summary>
         /// <param name="minValue">
@@ -154,16 +205,37 @@ private static long InternalGetRandomLongInteger (long minValue, long maxValue)
             }
         }
         //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Internal helper to generate a random unsigned long integer in the requested range.
+        /// </summary>
+        /// <param name="minValue">
+        /// The minimum value to return.
+        /// </param>
+        /// <param name="maxValue">
+        /// The maximum value to return.
+        /// </param>
+        /// <returns>
+        /// A random integer within the passed range of values.
+        /// </returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        private static ulong InternalGetRandomUnsignedLongInteger (ulong minValue, ulong maxValue)
+        {
+            ulong range = maxValue - minValue;
+            return minValue + (InternalGetRandomUnsignedLongInteger() % range);
+        }
+        //--------------------------------------------------------------------------------
 
         #region Implementation of IRandomSource
 
         //--------------------------------------------------------------------------------
         /// <inheritdoc />
-        public int GetRandomInteger (int maxValue) => (maxValue > 0) ? 
-            InternalGetRandomInteger (0, maxValue) : 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public int GetRandomInteger (int maxValue) => (maxValue > 0) ?
+            InternalGetRandomInteger(0, maxValue) :
             throw new ArgumentException($"{nameof(maxValue)} must be greater than zero");
         //--------------------------------------------------------------------------------
         /// <inheritdoc />
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public int GetRandomInteger (int minValue, int maxValue)
         {
             if (maxValue < minValue)
@@ -172,11 +244,26 @@ public int GetRandomInteger (int minValue, int maxValue)
         }
         //--------------------------------------------------------------------------------
         /// <inheritdoc />
-        public long GetRandomInteger (long maxValue) => (maxValue > 0) ? 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public uint GetRandomUnsignedInteger (uint maxValue) => InternalGetRandomUnsignedInteger(0, maxValue);
+        //--------------------------------------------------------------------------------
+        /// <inheritdoc />
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public uint GetRandomUnsignedInteger (uint minValue, uint maxValue)
+        {
+            if (maxValue < minValue)
+                throw new ArgumentOutOfRangeException(nameof(maxValue), $"{nameof(maxValue)} must be greater than or equal to {nameof(minValue)}");
+            return (minValue == maxValue) ? minValue : InternalGetRandomUnsignedInteger(minValue, maxValue);
+        }
+        //--------------------------------------------------------------------------------
+        /// <inheritdoc />
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public long GetRandomLongInteger (long maxValue) => (maxValue > 0) ?
             InternalGetRandomLongInteger(0, maxValue) :
             throw new ArgumentException($"{nameof(maxValue)} must be greater than zero");
         //--------------------------------------------------------------------------------
         /// <inheritdoc />
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public long GetRandomLongInteger (long minValue, long maxValue)
         {
             if (maxValue < minValue)
@@ -185,12 +272,28 @@ public long GetRandomLongInteger (long minValue, long maxValue)
         }
         //--------------------------------------------------------------------------------
         /// <inheritdoc />
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public ulong GetRandomUnsignedLongInteger (ulong maxValue) => InternalGetRandomUnsignedLongInteger(0, maxValue);
+        //--------------------------------------------------------------------------------
+        /// <inheritdoc />
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public ulong GetRandomUnsignedLongInteger (ulong minValue, ulong maxValue)
+        {
+            if (maxValue < minValue)
+                throw new ArgumentOutOfRangeException(nameof(maxValue), $"{nameof(maxValue)} must be greater than or equal to {nameof(minValue)}");
+            return (minValue == maxValue) ? minValue : InternalGetRandomUnsignedLongInteger(minValue, maxValue);
+        }
+        //--------------------------------------------------------------------------------
+        /// <inheritdoc />
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public int GetRandomBytes (byte[] byteArray, int byteCount = -1) => InternalGetRandomBytes(byteArray, byteCount);
         //--------------------------------------------------------------------------------
         /// <inheritdoc />
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public bool GetRandomBoolean () => (0 == (InternalGetRandomInteger(0, byte.MaxValue + 1) % 2));
         //--------------------------------------------------------------------------------
         /// <inheritdoc />
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public bool GetRandomFalse (int falseFrequency) =>
             falseFrequency switch
             {
@@ -200,6 +303,7 @@ public bool GetRandomFalse (int falseFrequency) =>
             };
         //--------------------------------------------------------------------------------
         /// <inheritdoc />
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public bool GetRandomTrue (int trueFrequency) =>
             trueFrequency switch
             {
diff --git a/Source/Tst/KZDev.PerfUtils.TestData/TestData.Static.cs b/Source/Tst/KZDev.PerfUtils.TestData/TestData.Static.cs
index c6c2a6b..5494579 100644
--- a/Source/Tst/KZDev.PerfUtils.TestData/TestData.Static.cs
+++ b/Source/Tst/KZDev.PerfUtils.TestData/TestData.Static.cs
@@ -38,6 +38,10 @@ public static IRandomSource SecureRandomSource
                 throw new InvalidOperationException("The random source has already been set.");
             }
         }
+        //--------------------------------------------------------------------------------
+
+        #region Integer Methods
+
         //--------------------------------------------------------------------------------
         /// <summary>
         /// Returns a random positive integer in the range of [0...int.MaxValue)
@@ -307,6 +311,281 @@ public static int[] GetTestIntegerMutableSet (IRandomSource randomSource, int se
         }
         //--------------------------------------------------------------------------------
 
+        #endregion Integer Methods
+
+        #region Unsigned Integer Methods
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Returns a random positive unsigned integer in the range of [0...uint.MaxValue)
+        /// </summary>
+        /// <returns>A random positive unsigned integer</returns>
+        public static uint GetTestUnsignedInteger (IRandomSource randomSource) => randomSource.GetRandomUnsignedInteger(0, uint.MaxValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Returns a random positive unsigned integer in the range of [0...maxValue)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating values.
+        /// </param>
+        /// <param name="maxValue">
+        /// The maximum value to return.
+        /// </param>
+        /// <returns>
+        /// A random positive unsigned integer.
+        /// </returns>
+        public static uint GetTestUnsignedInteger (IRandomSource randomSource, uint maxValue)
+        {
+            return (maxValue == 0) ? 0 : randomSource.GetRandomUnsignedInteger(0, maxValue);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        ///  Gets a random unsigned integer in the range of [minValue...maxValue)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="minValue">
+        /// The minimum value to return.
+        /// </param>
+        /// <param name="maxValue">
+        /// The maximum value to return.
+        /// </param>
+        /// <returns>
+        /// A random unsigned integer within the passed range of values.
+        /// </returns>
+        public static uint GetTestUnsignedInteger (IRandomSource randomSource, uint minValue, uint maxValue)
+        {
+            if (maxValue < minValue)
+                throw new ArgumentOutOfRangeException(nameof(maxValue), $"{nameof(maxValue)} must be greater than or equal to {nameof(minValue)}");
+            return (minValue == maxValue) ? minValue : randomSource.GetRandomUnsignedInteger(minValue, maxValue);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public static ImmutableArray<uint> GetTestUnsignedIntegerCollection (IRandomSource randomSource, int collectionSize, uint maxNumber) =>
+            GetTestUnsignedIntegerCollection(randomSource, collectionSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <param name="minNumber">The minimum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public static ImmutableArray<uint> GetTestUnsignedIntegerCollection (IRandomSource randomSource, int collectionSize, uint? minNumber = null, uint? maxNumber = null)
+        {
+            uint useMinNumber = minNumber ?? 0;
+            uint useMaxNumber = maxNumber ?? uint.MaxValue;
+            if (useMaxNumber < useMinNumber)
+                throw new ArgumentOutOfRangeException(nameof(maxNumber), $"{nameof(maxNumber)} must be greater than or equal to {nameof(minNumber)} ({useMinNumber})");
+            switch (collectionSize)
+            {
+                case < 0:
+                    throw new ArgumentOutOfRangeException(nameof(collectionSize), $"{nameof(collectionSize)} must be greater than or equal to zero");
+
+                case 0:
+                    return ImmutableArray<uint>.Empty;
+
+                case 1:
+                    return ImmutableArray.Create(GetTestUnsignedInteger(randomSource, useMinNumber, useMaxNumber));
+            }
+
+            ImmutableArray<uint>.Builder builder = ImmutableArray.CreateBuilder<uint>(collectionSize);
+
+            for (int i = 0; i < collectionSize; i++)
+                builder.Add(GetTestUnsignedInteger(randomSource, useMinNumber, useMaxNumber));
+
+            return builder.ToImmutable();
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public static uint[] GetTestUnsignedIntegerMutableCollection (IRandomSource randomSource, int collectionSize, uint maxNumber) =>
+            GetTestUnsignedIntegerMutableCollection(randomSource, collectionSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <param name="minNumber">The minimum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public static uint[] GetTestUnsignedIntegerMutableCollection (IRandomSource randomSource, int collectionSize, uint? minNumber = null, uint? maxNumber = null)
+        {
+            uint useMinNumber = minNumber ?? 0;
+            uint useMaxNumber = maxNumber ?? uint.MaxValue;
+            if (useMaxNumber < useMinNumber)
+                throw new ArgumentOutOfRangeException(nameof(maxNumber), $"{nameof(maxNumber)} must be greater than or equal to {nameof(minNumber)} ({useMinNumber})");
+            switch (collectionSize)
+            {
+                case < 0:
+                    throw new ArgumentOutOfRangeException(nameof(collectionSize), $"{nameof(collectionSize)} must be greater than or equal to zero");
+
+                case 0:
+                    return [];
+
+                case 1:
+                    return [GetTestUnsignedInteger(randomSource, useMinNumber, useMaxNumber)];
+            }
+
+            uint[] returnArray = new uint[collectionSize];
+
+            for (int i = 0; i < collectionSize; i++)
+                returnArray[i] = GetTestUnsignedInteger(randomSource, useMinNumber, useMaxNumber);
+
+            return returnArray;
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a set of unique test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public static ImmutableArray<uint> GetTestUnsignedIntegerSet (IRandomSource randomSource, int setSize, uint maxNumber) =>
+            GetTestUnsignedIntegerSet(randomSource, setSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a set of unique test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <param name="minNumber">The minimum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public static ImmutableArray<uint> GetTestUnsignedIntegerSet (IRandomSource randomSource, int setSize, uint? minNumber = null, uint? maxNumber = null)
+        {
+            uint useMinNumber = minNumber ?? 0;
+            uint useMaxNumber = maxNumber ?? uint.MaxValue;
+            if (useMaxNumber < useMinNumber)
+                throw new ArgumentOutOfRangeException(nameof(maxNumber), $"{nameof(maxNumber)} must be greater than or equal to {nameof(minNumber)} ({useMinNumber})");
+            if (setSize > (useMaxNumber - useMinNumber + 1))
+                throw new ArgumentOutOfRangeException(nameof(setSize), $"{nameof(setSize)} must be less than or equal to the difference between {nameof(maxNumber)} ({useMaxNumber}) and {nameof(minNumber)} ({useMinNumber})");
+            switch (setSize)
+            {
+                case < 0:
+                    throw new ArgumentOutOfRangeException(nameof(setSize), $"{nameof(setSize)} must be greater than or equal to zero");
+
+                case 0:
+                    return ImmutableArray<uint>.Empty;
+
+                case 1:
+                    return ImmutableArray.Create(GetTestUnsignedInteger(randomSource, useMinNumber, useMaxNumber));
+            }
+
+            // Use a hash set to ensure uniqueness
+            HashSet<uint> returnList = new();
+
+            while (returnList.Count < setSize)
+            {
+                uint nextNumber = GetTestUnsignedInteger(randomSource, useMinNumber, useMaxNumber);
+                returnList.Add(nextNumber);
+            }
+
+            return returnList.ToImmutableArray();
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a mutable set of unique test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public static uint[] GetTestUnsignedIntegerMutableSet (IRandomSource randomSource, int setSize, uint maxNumber) =>
+            GetTestUnsignedIntegerMutableSet(randomSource, setSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a mutable set of unique test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <param name="minNumber">The minimum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public static uint[] GetTestUnsignedIntegerMutableSet (IRandomSource randomSource, int setSize, uint? minNumber = null, uint? maxNumber = null)
+        {
+            uint useMinNumber = minNumber ?? 0;
+            uint useMaxNumber = maxNumber ?? uint.MaxValue;
+            if (useMaxNumber < useMinNumber)
+                throw new ArgumentOutOfRangeException(nameof(maxNumber), $"{nameof(maxNumber)} must be greater than or equal to {nameof(minNumber)} ({useMinNumber})");
+            if (setSize > (useMaxNumber - useMinNumber + 1))
+                throw new ArgumentOutOfRangeException(nameof(setSize), $"{nameof(setSize)} must be less than or equal to the difference between {nameof(maxNumber)} ({useMaxNumber}) and {nameof(minNumber)} ({useMinNumber})");
+            switch (setSize)
+            {
+                case < 0:
+                    throw new ArgumentOutOfRangeException(nameof(setSize), $"{nameof(setSize)} must be greater than or equal to zero");
+
+                case 0:
+                    return [];
+
+                case 1:
+                    return [GetTestUnsignedInteger(randomSource, useMinNumber, useMaxNumber)];
+            }
+
+            // Use a hash set to ensure uniqueness
+            HashSet<uint> returnList = new();
+
+            while (returnList.Count < setSize)
+            {
+                uint nextNumber = GetTestUnsignedInteger(randomSource, useMinNumber, useMaxNumber);
+                returnList.Add(nextNumber);
+            }
+
+            return [.. returnList];
+        }
+        //--------------------------------------------------------------------------------
+
+        #endregion Unsigned Integer Methods
+
+        #region Long Integer Methods
+
         //--------------------------------------------------------------------------------
         /// <summary>
         /// Returns a random positive long integer in the range of [0...long.MaxValue)
@@ -573,6 +852,281 @@ public static long[] GetTestLongIntegerMutableSet (IRandomSource randomSource, i
         }
         //--------------------------------------------------------------------------------
 
+        #endregion Long Integer Methods
+
+        #region Unsigned Long Integer Methods
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Returns a random positive unsigned long integer in the range of [0...ulong.MaxValue)
+        /// </summary>
+        /// <returns>A random positive unsigned long integer</returns>
+        public static ulong GetTestUnsignedLongInteger (IRandomSource randomSource) => randomSource.GetRandomUnsignedLongInteger(0, ulong.MaxValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Returns a random positive unsigned long integer in the range of [0...maxValue)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating values.
+        /// </param>
+        /// <param name="maxValue">
+        /// The maximum value to return.
+        /// </param>
+        /// <returns>
+        /// A random positive unsigned long integer.
+        /// </returns>
+        public static ulong GetTestUnsignedLongInteger (IRandomSource randomSource, ulong maxValue)
+        {
+            return (maxValue == 0) ? 0 : randomSource.GetRandomUnsignedLongInteger(0, maxValue);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        ///  Gets a random unsigned long integer in the range of [minValue...maxValue)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="minValue">
+        /// The minimum value to return.
+        /// </param>
+        /// <param name="maxValue">
+        /// The maximum value to return.
+        /// </param>
+        /// <returns>
+        /// A random unsigned long integer within the passed range of values.
+        /// </returns>
+        public static ulong GetTestUnsignedLongInteger (IRandomSource randomSource, ulong minValue, ulong maxValue)
+        {
+            if (maxValue < minValue)
+                throw new ArgumentOutOfRangeException(nameof(maxValue), $"{nameof(maxValue)} must be greater than or equal to {nameof(minValue)}");
+            return (minValue == maxValue) ? minValue : randomSource.GetRandomUnsignedLongInteger(minValue, maxValue);
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public static ImmutableArray<ulong> GetTestUnsignedLongIntegerCollection (IRandomSource randomSource, int collectionSize, ulong maxNumber) =>
+            GetTestUnsignedLongIntegerCollection(randomSource, collectionSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <param name="minNumber">The minimum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public static ImmutableArray<ulong> GetTestUnsignedLongIntegerCollection (IRandomSource randomSource, int collectionSize, ulong? minNumber = null, ulong? maxNumber = null)
+        {
+            ulong useMinNumber = minNumber ?? 0;
+            ulong useMaxNumber = maxNumber ?? ulong.MaxValue;
+            if (useMaxNumber < useMinNumber)
+                throw new ArgumentOutOfRangeException(nameof(maxNumber), $"{nameof(maxNumber)} must be greater than or equal to {nameof(minNumber)} ({useMinNumber})");
+            switch (collectionSize)
+            {
+                case < 0:
+                    throw new ArgumentOutOfRangeException(nameof(collectionSize), $"{nameof(collectionSize)} must be greater than or equal to zero");
+
+                case 0:
+                    return ImmutableArray<ulong>.Empty;
+
+                case 1:
+                    return ImmutableArray.Create(GetTestUnsignedLongInteger(randomSource, useMinNumber, useMaxNumber));
+            }
+
+            ImmutableArray<ulong>.Builder builder = ImmutableArray.CreateBuilder<ulong>(collectionSize);
+
+            for (int i = 0; i < collectionSize; i++)
+                builder.Add(GetTestUnsignedLongInteger(randomSource, useMinNumber, useMaxNumber));
+
+            return builder.ToImmutable();
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public static ulong[] GetTestUnsignedLongIntegerMutableCollection (IRandomSource randomSource, int collectionSize, ulong maxNumber) =>
+            GetTestUnsignedLongIntegerMutableCollection(randomSource, collectionSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <param name="minNumber">The minimum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public static ulong[] GetTestUnsignedLongIntegerMutableCollection (IRandomSource randomSource, int collectionSize, ulong? minNumber = null, ulong? maxNumber = null)
+        {
+            ulong useMinNumber = minNumber ?? 0;
+            ulong useMaxNumber = maxNumber ?? ulong.MaxValue;
+            if (useMaxNumber < useMinNumber)
+                throw new ArgumentOutOfRangeException(nameof(maxNumber), $"{nameof(maxNumber)} must be greater than or equal to {nameof(minNumber)} ({useMinNumber})");
+            switch (collectionSize)
+            {
+                case < 0:
+                    throw new ArgumentOutOfRangeException(nameof(collectionSize), $"{nameof(collectionSize)} must be greater than or equal to zero");
+
+                case 0:
+                    return [];
+
+                case 1:
+                    return [GetTestUnsignedLongInteger(randomSource, useMinNumber, useMaxNumber)];
+            }
+
+            ulong[] returnArray = new ulong[collectionSize];
+
+            for (int i = 0; i < collectionSize; i++)
+                returnArray[i] = GetTestUnsignedLongInteger(randomSource, useMinNumber, useMaxNumber);
+
+            return returnArray;
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a set of unique test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public static ImmutableArray<ulong> GetTestUnsignedLongIntegerSet (IRandomSource randomSource, int setSize, ulong maxNumber) =>
+            GetTestUnsignedLongIntegerSet(randomSource, setSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a set of unique test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <param name="minNumber">The minimum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public static ImmutableArray<ulong> GetTestUnsignedLongIntegerSet (IRandomSource randomSource, int setSize, ulong? minNumber = null, ulong? maxNumber = null)
+        {
+            long useSetSize = setSize;
+            ulong useMinNumber = minNumber ?? 0;
+            ulong useMaxNumber = maxNumber ?? ulong.MaxValue;
+            if (useMaxNumber < useMinNumber)
+                throw new ArgumentOutOfRangeException(nameof(maxNumber), $"{nameof(maxNumber)} must be greater than or equal to {nameof(minNumber)} ({useMinNumber})");
+            if (useSetSize < 0)
+                throw new ArgumentOutOfRangeException(nameof(setSize), $"{nameof(setSize)} must be greater than or equal to zero");
+            if ((ulong)useSetSize > (useMaxNumber - useMinNumber + 1))
+                throw new ArgumentOutOfRangeException(nameof(setSize), $"{nameof(setSize)} must be less than or equal to the difference between {nameof(maxNumber)} ({useMaxNumber}) and {nameof(minNumber)} ({useMinNumber})");
+            switch (useSetSize)
+            {
+                case 0:
+                    return ImmutableArray<ulong>.Empty;
+
+                case 1:
+                    return ImmutableArray.Create(GetTestUnsignedLongInteger(randomSource, useMinNumber, useMaxNumber));
+            }
+
+            // Use a hash set to ensure uniqueness
+            HashSet<ulong> returnList = new();
+
+            while (returnList.Count < setSize)
+            {
+                ulong nextNumber = GetTestUnsignedLongInteger(randomSource, useMinNumber, useMaxNumber);
+                returnList.Add(nextNumber);
+            }
+
+            return returnList.ToImmutableArray();
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a mutable set of unique test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public static ulong[] GetTestUnsignedLongIntegerMutableSet (IRandomSource randomSource, int setSize, ulong maxNumber) =>
+            GetTestUnsignedLongIntegerMutableSet(randomSource, setSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a mutable set of unique test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <param name="minNumber">The minimum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public static ulong[] GetTestUnsignedLongIntegerMutableSet (IRandomSource randomSource, int setSize, ulong? minNumber = null, ulong? maxNumber = null)
+        {
+            long useSetSize = setSize;
+            ulong useMinNumber = minNumber ?? 0;
+            ulong useMaxNumber = maxNumber ?? ulong.MaxValue;
+            if (useMaxNumber < useMinNumber)
+                throw new ArgumentOutOfRangeException(nameof(maxNumber), $"{nameof(maxNumber)} must be greater than or equal to {nameof(minNumber)} ({useMinNumber})");
+            if (useSetSize < 0)
+                throw new ArgumentOutOfRangeException(nameof(setSize), $"{nameof(setSize)} must be greater than or equal to zero");
+            if ((ulong)useSetSize > (useMaxNumber - useMinNumber + 1))
+                throw new ArgumentOutOfRangeException(nameof(setSize), $"{nameof(setSize)} must be less than or equal to the difference between {nameof(maxNumber)} ({useMaxNumber}) and {nameof(minNumber)} ({useMinNumber})");
+            switch (useSetSize)
+            {
+                case 0:
+                    return [];
+
+                case 1:
+                    return [GetTestUnsignedLongInteger(randomSource, useMinNumber, useMaxNumber)];
+            }
+
+            // Use a hash set to ensure uniqueness
+            HashSet<ulong> returnList = new();
+
+            while (returnList.Count < setSize)
+            {
+                ulong nextNumber = GetTestUnsignedLongInteger(randomSource, useMinNumber, useMaxNumber);
+                returnList.Add(nextNumber);
+            }
+
+            return [.. returnList];
+        }
+        //--------------------------------------------------------------------------------
+
+        #endregion Unsigned Long Integer Methods
+
+        #region Double Methods
+
         //--------------------------------------------------------------------------------
         /// <summary>
         /// Allocates and returns a byte array of the specified length filled with 
@@ -658,6 +1212,7 @@ public static byte GetRandomByte ()
         }
         //--------------------------------------------------------------------------------
 
+        #endregion Double Methods
     }
     //################################################################################
 }
diff --git a/Source/Tst/KZDev.PerfUtils.TestData/TestData.cs b/Source/Tst/KZDev.PerfUtils.TestData/TestData.cs
index 5bcce29..0595064 100644
--- a/Source/Tst/KZDev.PerfUtils.TestData/TestData.cs
+++ b/Source/Tst/KZDev.PerfUtils.TestData/TestData.cs
@@ -40,6 +40,8 @@ protected virtual IRandomSource RandomSource
         }
         //--------------------------------------------------------------------------------
 
+        #region Integer Methods
+
         //--------------------------------------------------------------------------------
         /// <summary>
         /// Returns a random positive integer in the range of [0...int.MaxValue)
@@ -166,6 +168,140 @@ public int[] GetTestIntegerMutableSet (int setSize, int? minNumber = null, int?
             GetTestIntegerMutableSet(RandomSource, setSize, minNumber, maxNumber);
         //--------------------------------------------------------------------------------
 
+        #endregion Integer Methods
+
+        #region Unsigned Integer Methods
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Returns a random unsigned integer in the range of [0...uint.MaxValue)
+        /// </summary>
+        /// <returns>A random unsigned integer</returns>
+        public uint GetTestUnsignedInteger () => GetTestUnsignedInteger(RandomSource);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Returns a random unsigned integer in the range of [0...maxValue)
+        /// </summary>
+        /// <param name="maxValue">
+        /// The maximum value to return.
+        /// </param>
+        /// <returns>
+        /// A random unsigned integer.
+        /// </returns>
+        public uint GetTestUnsignedInteger (uint maxValue) => GetTestUnsignedInteger(RandomSource, maxValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        ///  Gets a random integer in the range of [minValue...maxValue)
+        /// </summary>
+        /// <param name="minValue">
+        /// The minimum value to return.
+        /// </param>
+        /// <param name="maxValue">
+        /// The maximum value to return.
+        /// </param>
+        /// <returns>
+        /// A random integer within the passed range of values.
+        /// </returns>
+        public uint GetTestUnsignedInteger (uint minValue, uint maxValue) =>
+            GetTestUnsignedInteger(RandomSource, minValue, maxValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public ImmutableArray<uint> GetTestUnsignedIntegerCollection (int collectionSize, uint maxNumber) =>
+            GetTestUnsignedIntegerCollection(collectionSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <param name="minNumber">The minimum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public ImmutableArray<uint> GetTestUnsignedIntegerCollection (int collectionSize, uint? minNumber = null, uint? maxNumber = null) =>
+            GetTestUnsignedIntegerCollection(RandomSource, collectionSize, minNumber, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public uint[] GetTestUnsignedIntegerMutableCollection (int collectionSize, uint maxNumber) =>
+            GetTestUnsignedIntegerMutableCollection(collectionSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <param name="minNumber">The minimum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public uint[] GetTestUnsignedIntegerMutableCollection (int collectionSize, uint? minNumber = null, uint? maxNumber = null) =>
+            GetTestUnsignedIntegerMutableCollection(RandomSource, collectionSize, minNumber, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a set of unique test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public ImmutableArray<uint> GetTestUnsignedIntegerSet (int setSize, uint maxNumber) =>
+            GetTestUnsignedIntegerSet(setSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a set of unique test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <param name="minNumber">The minimum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public ImmutableArray<uint> GetTestUnsignedIntegerSet (int setSize, uint? minNumber = null, uint? maxNumber = null) =>
+            GetTestUnsignedIntegerSet(RandomSource, setSize, minNumber, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a mutable set of unique test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public uint[] GetTestUnsignedIntegerMutableSet (int setSize, uint maxNumber) =>
+            GetTestUnsignedIntegerMutableSet(setSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a mutable set of unique test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <param name="minNumber">The minimum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public uint[] GetTestUnsignedIntegerMutableSet (int setSize, uint? minNumber = null, uint? maxNumber = null) =>
+            GetTestUnsignedIntegerMutableSet(RandomSource, setSize, minNumber, maxNumber);
+        //--------------------------------------------------------------------------------
+
+        #endregion Unsigned Integer Methods
+
+        #region Long Integer Methods
+
         //--------------------------------------------------------------------------------
         /// <summary>
         /// Returns a random positive long integer in the range of [0...long.MaxValue)
@@ -291,6 +427,138 @@ public long[] GetTestLongIntegerMutableSet (int setSize, long? minNumber = null,
             GetTestLongIntegerMutableSet(RandomSource, setSize, minNumber, maxNumber);
         //--------------------------------------------------------------------------------
 
+        #endregion Long Integer Methods
+
+        #region Unsigned Long Integer Methods
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Returns a random unsigned integer in the range of [0...ulong.MaxValue)
+        /// </summary>
+        /// <returns>A random unsigned integer</returns>
+        public ulong GetTestUnsignedLongInteger () => GetTestUnsignedLongInteger(RandomSource);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Returns a random unsigned integer in the range of [0...maxValue)
+        /// </summary>
+        /// <param name="maxValue">
+        /// The maximum value to return.
+        /// </param>
+        /// <returns>
+        /// A random unsigned integer.
+        /// </returns>
+        public ulong GetTestUnsignedLongInteger (ulong maxValue) => GetTestUnsignedLongInteger(RandomSource, maxValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        ///  Gets a random integer in the range of [minValue...maxValue)
+        /// </summary>
+        /// <param name="minValue">
+        /// The minimum value to return.
+        /// </param>
+        /// <param name="maxValue">
+        /// The maximum value to return.
+        /// </param>
+        /// <returns>
+        /// A random integer within the passed range of values.
+        /// </returns>
+        public ulong GetTestUnsignedLongInteger (ulong minValue, ulong maxValue) =>
+            GetTestUnsignedLongInteger(RandomSource, minValue, maxValue);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public ImmutableArray<ulong> GetTestUnsignedLongIntegerCollection (int collectionSize, ulong maxNumber) =>
+            GetTestUnsignedLongIntegerCollection(collectionSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <param name="minNumber">The minimum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public ImmutableArray<ulong> GetTestUnsignedLongIntegerCollection (int collectionSize, ulong? minNumber = null, ulong? maxNumber = null) =>
+            GetTestUnsignedLongIntegerCollection(RandomSource, collectionSize, minNumber, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public ulong[] GetTestUnsignedLongIntegerMutableCollection (int collectionSize, ulong maxNumber) =>
+            GetTestUnsignedLongIntegerMutableCollection(collectionSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a collection of test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="collectionSize">The size of collection set of integers to get</param>
+        /// <param name="maxNumber">The maximum number value to include in the collection.</param>
+        /// <param name="minNumber">The minimum number value to include in the collection.</param>
+        /// <returns>
+        /// An immutable array of integers.
+        /// </returns>
+        public ulong[] GetTestUnsignedLongIntegerMutableCollection (int collectionSize, ulong? minNumber = null, ulong? maxNumber = null) =>
+            GetTestUnsignedLongIntegerMutableCollection(RandomSource, collectionSize, minNumber, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a set of unique test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public ImmutableArray<ulong> GetTestUnsignedLongIntegerSet (int setSize, ulong maxNumber) =>
+            GetTestUnsignedLongIntegerSet(setSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a set of unique test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <param name="minNumber">The minimum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public ImmutableArray<ulong> GetTestUnsignedLongIntegerSet (int setSize, ulong? minNumber = null, ulong? maxNumber = null) =>
+            GetTestUnsignedLongIntegerSet(RandomSource, setSize, minNumber, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a mutable set of unique test integers in the range of [0...maxNumber)
+        /// </summary>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public ulong[] GetTestUnsignedLongIntegerMutableSet (int setSize, ulong maxNumber) =>
+            GetTestUnsignedLongIntegerMutableSet(setSize, 0, maxNumber);
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Gets a mutable set of unique test integers in the range of [minNumber...maxNumber)
+        /// </summary>
+        /// <param name="setSize">The size of the set of integers to get.</param>
+        /// <param name="maxNumber">The maximum number value to include in the set.</param>
+        /// <param name="minNumber">The minimum number value to include in the set.</param>
+        /// <returns>
+        /// An immutable array of unique integers.
+        /// </returns>
+        public ulong[] GetTestUnsignedLongIntegerMutableSet (int setSize, ulong? minNumber = null, ulong? maxNumber = null) =>
+            GetTestUnsignedLongIntegerMutableSet(RandomSource, setSize, minNumber, maxNumber);
+        //--------------------------------------------------------------------------------
+
+        #endregion Unsigned Long Integer Methods
+
         //--------------------------------------------------------------------------------
         /// <summary>
         /// Allocates and returns a byte array of a random length between <paramref name="minSize"/> and
diff --git a/Source/Tst/KZDev.PerfUtils.TestPrep/KZDev.PerfUtils.TestPrep.csproj b/Source/Tst/KZDev.PerfUtils.TestPrep/KZDev.PerfUtils.TestPrep.csproj
index 6ca6ed4..ab25d86 100644
--- a/Source/Tst/KZDev.PerfUtils.TestPrep/KZDev.PerfUtils.TestPrep.csproj
+++ b/Source/Tst/KZDev.PerfUtils.TestPrep/KZDev.PerfUtils.TestPrep.csproj
@@ -4,7 +4,7 @@
 	</ItemGroup>
 
 	<ItemGroup Condition="'$(TargetFramework)'=='net6.0'">
-		<PackageReference Include="System.Collections.Immutable" Version="8.0.0" />
+		<PackageReference Include="System.Collections.Immutable" Version="$(PerfUtils-Pkg-System_Collections_Immutable)" />
 	</ItemGroup>
 
 	<ItemGroup>
diff --git a/Source/Tst/KZDev.PerfUtils.TestPrep/MemoryTestPrep.Static.cs b/Source/Tst/KZDev.PerfUtils.TestPrep/MemoryTestPrep.Static.cs
index a5156fd..2a3901c 100644
--- a/Source/Tst/KZDev.PerfUtils.TestPrep/MemoryTestPrep.Static.cs
+++ b/Source/Tst/KZDev.PerfUtils.TestPrep/MemoryTestPrep.Static.cs
@@ -319,6 +319,52 @@ public static async Task<byte[]> FillStreamAndArrayWithRandomBytesWithYieldAsync
         /// It is assumed that the stream is writable and that the stream position is at the
         /// location where the random bytes should be written.
         /// </remarks>
+        /// <param name="randomSource">
+        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// </param>
+        /// <param name="stream">
+        /// The stream to fill with random bytes.
+        /// </param>
+        /// <param name="byteCount">
+        /// The number of bytes to write to the stream.
+        /// </param>
+        /// <returns>
+        /// An array that contains a copy of the bytes written to the stream.
+        /// </returns>
+        /// <param name="bySegmentSize">
+        /// The size of each segment used to write the data.
+        /// </param>
+        public static async Task<byte[]> FillStreamAndArrayWithRandomBytesWithYieldAsync (IRandomSource randomSource,
+            Stream stream, int byteCount, int bySegmentSize)
+        {
+            byte[] returnData = new byte[byteCount];
+            GetRandomBytes(returnData, byteCount);
+            int bytesLeft = byteCount;
+            int byteIndex = 0;
+            while (bytesLeft > 0)
+            {
+                int byteCountToWrite = Math.Min(bySegmentSize, bytesLeft);
+                // Randomly yield or just continue.
+                if (randomSource.GetRandomTrue(5))
+                {
+                    await Task.Yield();
+                }
+                await stream.WriteAsync(returnData, byteIndex, byteCountToWrite);
+                byteIndex += byteCountToWrite;
+                bytesLeft -= byteCountToWrite;
+            }
+            return returnData;
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Fills the provided stream with random bytes. The number of bytes written to the
+        /// stream is determined by the <paramref name="byteCount"/> parameter. This also 
+        /// returns the array of bytes that was written to the stream.
+        /// </summary>
+        /// <remarks>
+        /// It is assumed that the stream is writable and that the stream position is at the
+        /// location where the random bytes should be written.
+        /// </remarks>
         /// <param name="stream">
         /// The stream to fill with random bytes.
         /// </param>
@@ -349,7 +395,8 @@ public static byte[] FillStreamAndArrayWithRandomBytes (Stream stream, int byteC
         //--------------------------------------------------------------------------------
         /// <summary>
         /// Fills the provided stream with random bytes. The number of bytes written to the
-        /// stream is determined by the <paramref name="byteCount"/> parameter.
+        /// stream is determined by the <paramref name="byteCount"/> parameter. This also 
+        /// returns the array of bytes that was written to the stream.
         /// </summary>
         /// <remarks>
         /// It is assumed that the stream is writable and that the stream position is at the
@@ -403,9 +450,41 @@ public static async Task<byte[]> FillStreamAndArrayWithRandomBytesAsync (Stream
         /// It is assumed that the stream is writable and that the stream position is at the
         /// location where the random bytes should be written.
         /// </remarks>
-        /// <param name="randomSource">
-        /// The <see cref="IRandomSource"/> instance to use for generating random bytes.
+        /// <param name="stream">
+        /// The stream to fill with random bytes.
+        /// </param>
+        /// <param name="byteCount">
+        /// The number of bytes to write to the stream.
+        /// </param>
+        /// <returns>
+        /// An array that contains a copy of the bytes written to the stream.
+        /// </returns>
+        /// <param name="bySegmentSize">
+        /// The size of each segment used to write the data.
         /// </param>
+        public static void FillStreamWithRandomBytes (Stream stream, int byteCount, int bySegmentSize)
+        {
+            byte[] fillData = new byte[byteCount];
+            GetRandomBytes(fillData, byteCount);
+            int bytesLeft = byteCount;
+            int byteIndex = 0;
+            while (bytesLeft > 0)
+            {
+                int byteCountToWrite = Math.Min(bySegmentSize, bytesLeft);
+                stream.Write(fillData, byteIndex, byteCountToWrite);
+                byteIndex += byteCountToWrite;
+                bytesLeft -= byteCountToWrite;
+            }
+        }
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Fills the provided stream with random bytes. The number of bytes written to the
+        /// stream is determined by the <paramref name="byteCount"/> parameter.
+        /// </summary>
+        /// <remarks>
+        /// It is assumed that the stream is writable and that the stream position is at the
+        /// location where the random bytes should be written.
+        /// </remarks>
         /// <param name="stream">
         /// The stream to fill with random bytes.
         /// </param>
@@ -418,26 +497,31 @@ public static async Task<byte[]> FillStreamAndArrayWithRandomBytesAsync (Stream
         /// <param name="bySegmentSize">
         /// The size of each segment used to write the data.
         /// </param>
-        public static async Task<byte[]> FillStreamAndArrayWithRandomBytesWithYieldAsync (IRandomSource randomSource,
-            Stream stream, int byteCount, int bySegmentSize)
+        public static async Task FillStreamWithRandomBytesAsync (Stream stream, int byteCount, int bySegmentSize)
         {
-            byte[] returnData = new byte[byteCount];
-            GetRandomBytes(returnData, byteCount);
+            byte[] fillData = new byte[byteCount];
+            GetRandomBytes(fillData, byteCount);
             int bytesLeft = byteCount;
             int byteIndex = 0;
+            bool useMemoryInstance = false;
+
             while (bytesLeft > 0)
             {
                 int byteCountToWrite = Math.Min(bySegmentSize, bytesLeft);
-                // Randomly yield or just continue.
-                if (randomSource.GetRandomTrue(5))
+                // Alternate between using the memory instance and the array buffer
+                if (useMemoryInstance)
                 {
-                    await Task.Yield();
+                    Memory<byte> memory = new(fillData, byteIndex, byteCountToWrite);
+                    await stream.WriteAsync(memory);
+                }
+                else
+                {
+                    await stream.WriteAsync(fillData, byteIndex, byteCountToWrite);
                 }
-                await stream.WriteAsync(returnData, byteIndex, byteCountToWrite);
                 byteIndex += byteCountToWrite;
                 bytesLeft -= byteCountToWrite;
+                useMemoryInstance = !useMemoryInstance;
             }
-            return returnData;
         }
         //--------------------------------------------------------------------------------
     }
diff --git a/Source/Tst/Shared/KZDev.PerfUtils.Memory.Sequential.Tests.Shared/KZDev.PerfUtils.Memory.Sequential.Tests.Shared.projitems b/Source/Tst/Shared/KZDev.PerfUtils.Memory.Sequential.Tests.Shared/KZDev.PerfUtils.Memory.Sequential.Tests.Shared.projitems
index 09ad25c..7ccae91 100644
--- a/Source/Tst/Shared/KZDev.PerfUtils.Memory.Sequential.Tests.Shared/KZDev.PerfUtils.Memory.Sequential.Tests.Shared.projitems
+++ b/Source/Tst/Shared/KZDev.PerfUtils.Memory.Sequential.Tests.Shared/KZDev.PerfUtils.Memory.Sequential.Tests.Shared.projitems
@@ -9,6 +9,6 @@
     <Import_RootNamespace>KZDev.PerfUtils.Memory.Sequential.Tests.Shared</Import_RootNamespace>
   </PropertyGroup>
   <ItemGroup>
-    <Compile Include="$(MSBuildThisFileDirectory)UsingMemoryStreamSlim.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)UsingMemoryStreamSlimReleaseBuffersAndRead.cs" />
   </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/Source/Tst/Shared/KZDev.PerfUtils.Memory.Sequential.Tests.Shared/UsingMemoryStreamSlim.cs b/Source/Tst/Shared/KZDev.PerfUtils.Memory.Sequential.Tests.Shared/UsingMemoryStreamSlimReleaseBuffersAndRead.cs
similarity index 78%
rename from Source/Tst/Shared/KZDev.PerfUtils.Memory.Sequential.Tests.Shared/UsingMemoryStreamSlim.cs
rename to Source/Tst/Shared/KZDev.PerfUtils.Memory.Sequential.Tests.Shared/UsingMemoryStreamSlimReleaseBuffersAndRead.cs
index 493e252..df85485 100644
--- a/Source/Tst/Shared/KZDev.PerfUtils.Memory.Sequential.Tests.Shared/UsingMemoryStreamSlim.cs
+++ b/Source/Tst/Shared/KZDev.PerfUtils.Memory.Sequential.Tests.Shared/UsingMemoryStreamSlimReleaseBuffersAndRead.cs
@@ -1,6 +1,8 @@
 // Copyright (c) Kevin Zehrer
 // Licensed under the MIT License. See LICENSE file in the project root for full license information.
 
+using Xunit.Abstractions;
+
 namespace KZDev.PerfUtils.Tests
 {
     //################################################################################
@@ -8,19 +10,25 @@ namespace KZDev.PerfUtils.Tests
     /// Unit tests for the <see cref="MemoryStreamSlim"/> class that never run in 
     /// parallel with other tests.
     /// </summary>
-    public partial class UsingMemoryStreamSlim
+    public class UsingMemoryStreamSlimReleaseBuffersAndRead : UsingMemoryStreamSlimUnitTestBase
     {
+        /// <summary>
+        /// The minimum number of test loops to run for the tests.
+        /// </summary>
+        private const int MinimumTestLoops = 100;
+        /// <summary>
+        /// The maximum number of test loops to run for the tests.
+        /// </summary>
+        private const int MaximumTestLoops = 500;
         //--------------------------------------------------------------------------------
         /// <summary>
-        /// Static constructor for the <see cref="UsingMemoryStreamSlim"/> class.
+        /// Initializes a new instance of the <see cref="UsingMemoryStreamSlimReleaseBuffersAndRead"/> class.
         /// </summary>
-        static UsingMemoryStreamSlim ()
+        /// <param name="xUnitTestOutputHelper">
+        /// The Xunit test output helper that can be used to output test messages
+        /// </param>
+        public UsingMemoryStreamSlimReleaseBuffersAndRead (ITestOutputHelper xUnitTestOutputHelper) : base(xUnitTestOutputHelper)
         {
-#if NATIVEMEMORY
-            MemoryStreamSlim.UseNativeLargeMemoryBuffers = true;
-#else
-            MemoryStreamSlim.UseNativeLargeMemoryBuffers = false;
-#endif
         }
         //--------------------------------------------------------------------------------
 
@@ -51,7 +59,7 @@ public async Task UsingMemoryStreamSlim_ReadBySegments_AfterMemoryRelease_Return
                     // ReSharper disable once MethodHasAsyncOverload
                     byte[] dataCopy = MemoryTestPrep.FillStreamAndArrayWithRandomBytes(testService, byteCount, testSegmentSize);
                     // Pick an unusual block size
-                    VerifyContentsFromStartToEndInBlocks(testService, dataCopy, 0x47);
+                    await VerifyContentsFromStartToEndInBlocksAsync(testService, dataCopy, 0x47);
                 }
 
             // Release the memory buffers
@@ -68,7 +76,7 @@ public async Task UsingMemoryStreamSlim_ReadBySegments_AfterMemoryRelease_Return
                     // ReSharper disable once MethodHasAsyncOverload
                     byte[] dataCopy = MemoryTestPrep.FillStreamAndArrayWithRandomBytes(testService, byteCount, testSegmentSize);
                     // Pick an unusual block size
-                    VerifyContentsFromStartToEndInBlocks(testService, dataCopy, 0x47);
+                    await VerifyContentsFromStartToEndInBlocksAsync(testService, dataCopy, 0x47);
                 }
         }
         //--------------------------------------------------------------------------------    
diff --git a/Source/Tst/Shared/KZDev.PerfUtils.Memory.Tests.Shared/KZDev.PerfUtils.Memory.Shared.projitems b/Source/Tst/Shared/KZDev.PerfUtils.Memory.Tests.Shared/KZDev.PerfUtils.Memory.Shared.projitems
index 3489526..6338ebe 100644
--- a/Source/Tst/Shared/KZDev.PerfUtils.Memory.Tests.Shared/KZDev.PerfUtils.Memory.Shared.projitems
+++ b/Source/Tst/Shared/KZDev.PerfUtils.Memory.Tests.Shared/KZDev.PerfUtils.Memory.Shared.projitems
@@ -9,6 +9,6 @@
     <Import_RootNamespace>KZDev.PerfUtils.Tests</Import_RootNamespace>
   </PropertyGroup>
   <ItemGroup>
-    <Compile Include="$(MSBuildThisFileDirectory)MemoryStreamSlimTestBase.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)UsingMemoryStreamSlimUnitTestBase.cs" />
   </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/Source/Tst/Shared/KZDev.PerfUtils.Memory.Tests.Shared/MemoryStreamSlimTestBase.cs b/Source/Tst/Shared/KZDev.PerfUtils.Memory.Tests.Shared/UsingMemoryStreamSlimUnitTestBase.cs
similarity index 92%
rename from Source/Tst/Shared/KZDev.PerfUtils.Memory.Tests.Shared/MemoryStreamSlimTestBase.cs
rename to Source/Tst/Shared/KZDev.PerfUtils.Memory.Tests.Shared/UsingMemoryStreamSlimUnitTestBase.cs
index eb5b07b..bd9619b 100644
--- a/Source/Tst/Shared/KZDev.PerfUtils.Memory.Tests.Shared/MemoryStreamSlimTestBase.cs
+++ b/Source/Tst/Shared/KZDev.PerfUtils.Memory.Tests.Shared/UsingMemoryStreamSlimUnitTestBase.cs
@@ -3,6 +3,8 @@
 
 using KZDev.PerfUtils.Internals;
 
+using Xunit.Abstractions;
+
 /*
  * We minimize use of Fluent Assertions in this file because a number of these methods 
  * are hot paths in the tests, and Fluent Assertions often times allocate a number of strings.
@@ -18,19 +20,32 @@ namespace KZDev.PerfUtils.Tests
     /// <summary>
     /// Base class for tests for the <see cref="MemoryStreamSlim"/> class.
     /// </summary>
-    public partial class UsingMemoryStreamSlim
+    public abstract class UsingMemoryStreamSlimUnitTestBase : UnitTestBase
     {
         /*
-         * NOTE: For a number of tests here, we purposely run a loop over a set of test values
+         * NOTE: For a number of tests in derived classes, we purposely run a loop over a set of test values
          * instead of using Theory type tests because the test explorer shows each Theory
          * value set as a unique test and given the large number of different test values we 
          * may have, the unit test explorer can get difficult to navigate.
          */
 
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Static constructor for the <see cref="UsingMemoryStreamSlimUnitTestBase"/> class.
+        /// </summary>
+        static UsingMemoryStreamSlimUnitTestBase ()
+        {
+#if NATIVEMEMORY
+            MemoryStreamSlim.UseNativeLargeMemoryBuffers = true;
+#else
+            MemoryStreamSlim.UseNativeLargeMemoryBuffers = false;
+#endif
+        }
+        //--------------------------------------------------------------------------------
         /// <summary>
         /// A set of sizes used for 'segmented' fill and read operations
         /// </summary>
-        private static readonly int[] TestSegmentSizes = [0x10, 0x47, 0x100, 0x1000, 0x7919, 0x1_0000, 0x2_0000];
+        protected static readonly int[] TestSegmentSizes = [0x10, 0x47, 0x100, 0x1000, 0x7919, 0x1_0000, 0x2_0000];
         //--------------------------------------------------------------------------------   
         /// <summary>
         /// Helper for permuting the values in an array of a range of values
@@ -336,7 +351,7 @@ public IEnumerable<object[]> GetFillBufferTestSizes (int randomCount, int maxRan
         /// <param name="expectedBytes">
         /// A copy of the bytes that are expected to be in the stream.
         /// </param>
-        private static void VerifyContentsFromStartToEndByByte (Stream stream, byte[] expectedBytes)
+        protected static void VerifyContentsFromStartToEndByByte (Stream stream, byte[] expectedBytes)
         {
             stream.Position = 0;
             Assert.True(stream.Position == 0, "Position should be 0 to start");
@@ -368,7 +383,7 @@ private static void VerifyContentsFromStartToEndByByte (Stream stream, byte[] ex
         /// <param name="blockSize">
         /// The size of the block to use for reading the data.
         /// </param>
-        private static void VerifyContentsFromStartToEndInBlocksWithArrayBuffer (Stream stream, byte[] expectedBytes, int blockSize)
+        protected static void VerifyContentsFromStartToEndInBlocksWithArrayBuffer (Stream stream, byte[] expectedBytes, int blockSize)
         {
             stream.Position = 0;
             Assert.True(stream.Position == 0, "Position should be 0 to start");
@@ -408,7 +423,7 @@ private static void VerifyContentsFromStartToEndInBlocksWithArrayBuffer (Stream
         /// <param name="blockSize">
         /// The size of the block to use for reading the data.
         /// </param>
-        private static void VerifyContentsFromStartToEndInBlocks (Stream stream, byte[] expectedBytes, int blockSize)
+        protected static void VerifyContentsFromStartToEndInBlocks (Stream stream, byte[] expectedBytes, int blockSize)
         {
             stream.Position = 0;
             Assert.True(stream.Position == 0, "Position should be 0 to start");
@@ -472,7 +487,7 @@ private static void VerifyContentsFromStartToEndInBlocks (Stream stream, byte[]
         /// <param name="blockSize">
         /// The size of the block to use for reading the data.
         /// </param>
-        private static async Task VerifyContentsFromStartToEndInBlocksAsync (Stream stream, byte[] expectedBytes, int blockSize)
+        protected static async Task VerifyContentsFromStartToEndInBlocksAsync (Stream stream, byte[] expectedBytes, int blockSize)
         {
             stream.Position = 0;
             Assert.True(stream.Position == 0, "Position should be 0 to start");
@@ -532,7 +547,7 @@ private static async Task VerifyContentsFromStartToEndInBlocksAsync (Stream stre
         /// <param name="expectedBytes">
         /// A copy of the bytes that are expected to be in the stream.
         /// </param>
-        private static void VerifyContentsFromStartToEndInBlocks (Stream stream, byte[] expectedBytes) =>
+        protected static void VerifyContentsFromStartToEndInBlocks (Stream stream, byte[] expectedBytes) =>
             VerifyContentsFromStartToEndInBlocks(stream, expectedBytes, 0x10);
         //--------------------------------------------------------------------------------
         /// <summary>
@@ -545,7 +560,7 @@ private static void VerifyContentsFromStartToEndInBlocks (Stream stream, byte[]
         /// <param name="expectedBytes">
         /// A copy of the bytes that are expected to be in the stream.
         /// </param>
-        private static Task VerifyContentsFromStartToEndInBlocksAsync (Stream stream, byte[] expectedBytes) =>
+        protected static Task VerifyContentsFromStartToEndInBlocksAsync (Stream stream, byte[] expectedBytes) =>
             VerifyContentsFromStartToEndInBlocksAsync(stream, expectedBytes, 0x10);
         //--------------------------------------------------------------------------------
         /// <summary>
@@ -558,7 +573,7 @@ private static Task VerifyContentsFromStartToEndInBlocksAsync (Stream stream, by
         /// <param name="expectedBytes">
         /// A copy of the bytes that are expected to be in the stream.
         /// </param>
-        private static void VerifyContentsFromStartToEndOneRead (Stream stream, byte[] expectedBytes)
+        protected static void VerifyContentsFromStartToEndOneRead (Stream stream, byte[] expectedBytes)
         {
             stream.Position = 0;
             Assert.True(stream.Position == 0, "Position should be 0 to start");
@@ -592,7 +607,7 @@ private static void VerifyContentsFromStartToEndOneRead (Stream stream, byte[] e
         /// <param name="expectedBytes">
         /// A copy of the bytes that are expected to be in the stream.
         /// </param>
-        private static async Task VerifyContentsFromStartToEndOneReadAsync (Stream stream, byte[] expectedBytes)
+        protected static async Task VerifyContentsFromStartToEndOneReadAsync (Stream stream, byte[] expectedBytes)
         {
             stream.Position = 0;
             Assert.True(stream.Position == 0, "Position should be 0 to start");
@@ -620,7 +635,7 @@ private static async Task VerifyContentsFromStartToEndOneReadAsync (Stream strea
         /// <param name="expectedBytes">
         /// A copy of the bytes that are expected to be in the stream.
         /// </param>
-        private static void VerifyContents (Stream stream, byte[] expectedBytes)
+        protected static void VerifyContents (Stream stream, byte[] expectedBytes)
         {
             stream.Position = 0;
             Assert.True(stream.Position == 0, "Position should be 0 to start");
@@ -639,7 +654,7 @@ private static void VerifyContents (Stream stream, byte[] expectedBytes)
         /// <param name="expectedBytes">
         /// A copy of the bytes that are expected to be in the stream.
         /// </param>
-        private static async Task VerifyContentsAsync (Stream stream, byte[] expectedBytes)
+        protected static async Task VerifyContentsAsync (Stream stream, byte[] expectedBytes)
         {
             stream.Position = 0;
             Assert.True(stream.Position == 0, "Position should be 0 to start");
@@ -661,7 +676,7 @@ private static async Task VerifyContentsAsync (Stream stream, byte[] expectedByt
         /// <param name="bySegmentSize">
         /// The size of each segment used to read the data.
         /// </param>
-        private static void VerifyContents (Stream stream, byte[] expectedBytes, int bySegmentSize)
+        protected static void VerifyContents (Stream stream, byte[] expectedBytes, int bySegmentSize)
         {
             stream.Position = 0;
             Assert.True(stream.Position == 0, "Position should be 0 to start");
@@ -683,7 +698,7 @@ private static void VerifyContents (Stream stream, byte[] expectedBytes, int byS
         /// <param name="bySegmentSize">
         /// The size of each segment used to read the data.
         /// </param>
-        private static async Task VerifyContentsAsync (Stream stream, byte[] expectedBytes, int bySegmentSize)
+        protected static async Task VerifyContentsAsync (Stream stream, byte[] expectedBytes, int bySegmentSize)
         {
             stream.Position = 0;
             Assert.True(stream.Position == 0, "Position should be 0 to start");
@@ -703,7 +718,7 @@ private static async Task VerifyContentsAsync (Stream stream, byte[] expectedByt
         /// <param name="expectedBytes">
         /// A copy of the bytes that are expected to be in the stream.
         /// </param>
-        private static void VerifyStreamOperations (Stream stream, byte[] expectedBytes)
+        protected static void VerifyStreamOperations (Stream stream, byte[] expectedBytes)
         {
             stream.Position = 0;
             Assert.True(stream.Position == 0, "Position should be 0 to start");
@@ -729,7 +744,7 @@ private static void VerifyStreamOperations (Stream stream, byte[] expectedBytes)
         /// <param name="expectedBytes">
         /// A copy of the bytes that are expected to be in the stream.
         /// </param>
-        private static async Task VerifyStreamOperationsAsync (Stream stream, byte[] expectedBytes)
+        protected static async Task VerifyStreamOperationsAsync (Stream stream, byte[] expectedBytes)
         {
             stream.Position = 0;
             Assert.True(stream.Position == 0, "Position should be 0 to start");
@@ -758,7 +773,7 @@ private static async Task VerifyStreamOperationsAsync (Stream stream, byte[] exp
         /// <param name="bySegmentSize">
         /// The size of each segment used to write and read the data.
         /// </param>
-        private static void VerifyStreamOperations (Stream stream, byte[] expectedBytes, int bySegmentSize)
+        protected static void VerifyStreamOperations (Stream stream, byte[] expectedBytes, int bySegmentSize)
         {
             stream.Position = 0;
             Assert.True(stream.Position == 0, "Position should be 0 to start");
@@ -801,7 +816,7 @@ private static void VerifyStreamOperations (Stream stream, byte[] expectedBytes,
         /// <param name="bySegmentSize">
         /// The size of each segment used to write and read the data.
         /// </param>
-        private static async Task VerifyStreamOperationsAsync (Stream stream, byte[] expectedBytes, int bySegmentSize)
+        protected static async Task VerifyStreamOperationsAsync (Stream stream, byte[] expectedBytes, int bySegmentSize)
         {
             stream.Position = 0;
             Assert.True(stream.Position == 0, "Position should be 0 to start");
@@ -844,7 +859,7 @@ private static async Task VerifyStreamOperationsAsync (Stream stream, byte[] exp
         /// <param name="byteCount">
         /// The number of bytes to write to the stream and verify.
         /// </param>
-        private static async Task TestWriteAndVerifyBytesAsync (IRandomSource randomSource,
+        protected static async Task TestWriteAndVerifyBytesAsync (IRandomSource randomSource,
             Stream stream, int byteCount)
         {
             // Reset the stream
@@ -884,7 +899,7 @@ private static async Task TestWriteAndVerifyBytesAsync (IRandomSource randomSour
         /// <param name="bySegmentSize">
         /// The size of each segment used to write and read the data.
         /// </param>
-        private static async Task TestWriteAndVerifyBytesAsync (IRandomSource randomSource,
+        protected static async Task TestWriteAndVerifyBytesAsync (IRandomSource randomSource,
             Stream stream, int byteCount, int bySegmentSize)
         {
             // Reset the stream
@@ -926,7 +941,7 @@ private static async Task TestWriteAndVerifyBytesAsync (IRandomSource randomSour
         /// <param name="optionsSetupState">
         /// State data to pass to the options setup method.
         /// </param>
-        private static async Task TestStreamWriteAndVerifyContentAsync<TState> (IRandomSource randomSource,
+        protected static async Task TestStreamWriteAndVerifyContentAsync<TState> (IRandomSource randomSource,
             int dataSize, Action<MemoryStreamSlimOptions, TState> optionsSetup,
             TState optionsSetupState)
         {
@@ -956,7 +971,7 @@ private static async Task TestStreamWriteAndVerifyContentAsync<TState> (IRandomS
         /// <param name="optionsSetupState">
         /// State data to pass to the options setup method.
         /// </param>
-        private static async Task TestStreamWriteAndVerifyContentAsync<TState> (IRandomSource randomSource,
+        protected static async Task TestStreamWriteAndVerifyContentAsync<TState> (IRandomSource randomSource,
             int dataSize, int bySegmentSize, Action<MemoryStreamSlimOptions, TState> optionsSetup,
             TState optionsSetupState)
         {
@@ -968,6 +983,18 @@ private static async Task TestStreamWriteAndVerifyContentAsync<TState> (IRandomS
         //================================================================================
 
         #endregion Internal Test Methods
+
+        //--------------------------------------------------------------------------------
+        /// <summary>
+        /// Initializes a new instance of the <see cref="UsingMemoryStreamSlimUnitTestBase"/> class.
+        /// </summary>
+        /// <param name="xUnitTestOutputHelper">
+        /// The Xunit test output helper that can be used to output test messages
+        /// </param>
+        protected UsingMemoryStreamSlimUnitTestBase (ITestOutputHelper xUnitTestOutputHelper) : base(xUnitTestOutputHelper)
+        {
+        }
+        //--------------------------------------------------------------------------------
     }
     //################################################################################
 }
diff --git a/Source/Tst/Shared/KZDev.PerfUtils.MemoryStreamSlim.Tests.Shared/UsingMemoryStreamSlim.ReadWrite.cs b/Source/Tst/Shared/KZDev.PerfUtils.MemoryStreamSlim.Tests.Shared/UsingMemoryStreamSlim.ReadWrite.cs
index 87e5065..da552c6 100644
--- a/Source/Tst/Shared/KZDev.PerfUtils.MemoryStreamSlim.Tests.Shared/UsingMemoryStreamSlim.ReadWrite.cs
+++ b/Source/Tst/Shared/KZDev.PerfUtils.MemoryStreamSlim.Tests.Shared/UsingMemoryStreamSlim.ReadWrite.cs
@@ -17,18 +17,6 @@ namespace KZDev.PerfUtils.Tests
     /// </summary>
     public partial class UsingMemoryStreamSlim
     {
-        //--------------------------------------------------------------------------------
-        /// <summary>
-        /// Static constructor for the <see cref="UsingMemoryStreamSlim"/> class.
-        /// </summary>
-        static UsingMemoryStreamSlim ()
-        {
-#if NATIVEMEMORY
-            MemoryStreamSlim.UseNativeLargeMemoryBuffers = true;
-#else
-            MemoryStreamSlim.UseNativeLargeMemoryBuffers = false;
-#endif
-        }
         //--------------------------------------------------------------------------------
         /// <summary>
         /// Test helper to instantiate a new <see cref="MemoryStreamSlim"/> object as the test subject service.
@@ -404,7 +392,7 @@ public void UsingMemoryStreamSlim_WriteWithRandomJumps_WritesCorrectData ()
         [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.LongRun)]
         public async Task UsingMemoryStreamSlim_GetArray_ReturnsCorrectData ()
         {
-            int[] testDataSizes = GenerateTestDataSizes(1000, 0xF_FFFF).ToArray();
+            int[] testDataSizes = GenerateTestDataSizes(1000, 0xFFFF).ToArray();
             int testLoops = RandomSource.GetRandomInteger(MinimumTestLoops, MaximumTestLoops + 1);
 
             foreach (int testSegmentSize in TestSegmentSizes)
@@ -461,6 +449,7 @@ public void UsingMemoryStreamSlim_CopyFullToStream_CopiesAllData ()
         /// is identical to the data written.
         /// </summary>
         [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.MedRun)]
         public async Task UsingMemoryStreamSlim_CopyFullToStream_CopiesAllDataAsync ()
         {
             int[] testDataSizes = GenerateTestDataSizes(1000, 0xF_FFFF).ToArray();
@@ -490,6 +479,58 @@ public async Task UsingMemoryStreamSlim_CopyFullToStream_CopiesAllDataAsync ()
         }
         //--------------------------------------------------------------------------------    
         /// <summary>
+        /// Tests writing data to the stream and verifying that the contents of the other stream
+        /// is identical to the data written.
+        /// </summary>
+        [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.MedRun)]
+        public async Task UsingMemoryStreamSlim_CopyFullToStream_OnManyThreads_CopiesAllDataAsync ()
+        {
+            int[] testDataSizes = GenerateTestDataSizes(1000, 0xF_FFFF).ToArray();
+
+            ExceptionDispatchInfo? taskException = null;
+
+            Task[] runningTasks = Enumerable.Range(0, Math.Max(8, Environment.ProcessorCount * 2)).Select(_ => Task.Run(async () =>
+            {
+                try
+                {
+
+                    foreach (int testSegmentSize in TestSegmentSizes)
+                        for (int testLoop = 0; testLoop < MaximumTestLoops; testLoop++)
+                        {
+                            int byteCount = testDataSizes[RandomSource.GetRandomInteger(testDataSizes.Length)];
+                            await using MemoryStreamSlim testService = CreateTestService(byteCount);
+                            TestWriteLine($"Running test loop {testLoop} with byte count of {byteCount} and segment size {testSegmentSize}");
+
+                            // Fill the stream with random bytes
+                            byte[] dataCopy =
+                                await MemoryTestPrep.FillStreamAndArrayWithRandomBytesAsync(testService, byteCount, testSegmentSize);
+                            using MemoryStream memoryStream = new MemoryStream();
+                            // Copy to the memory stream
+                            testService.Seek(0, SeekOrigin.Begin);
+                            await testService.CopyToAsync(memoryStream);
+                            testService.Position.Should().Be(testService.Length);
+                            testService.Length.Should().Be(byteCount);
+                            memoryStream.Position.Should().Be(memoryStream.Length);
+                            memoryStream.Length.Should().Be(byteCount);
+                            // Verify the contents
+                            // Alternate how we verify the data
+                            if (0 == (testLoop & 1))
+                                await VerifyContentsFromStartToEndOneReadAsync(memoryStream, dataCopy);
+                            else
+                                await VerifyContentsFromStartToEndInBlocksAsync(memoryStream, dataCopy, 0x61);
+                        }
+                }
+                catch (Exception error)
+                {
+                    taskException ??= ExceptionDispatchInfo.Capture(error);
+                }
+            })).ToArray();
+            await Task.WhenAll(runningTasks);
+            taskException?.Throw();
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
         /// Tests writing data to the asynchronous stream and verifying that the contents of the other stream
         /// is identical to the data written.
         /// </summary>
@@ -529,20 +570,19 @@ public async Task UsingMemoryStreamSlim_CopyFullToAsyncStream_CopiesAllDataAsync
         /// is identical to the data written.
         /// </summary>
         [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.MedRun)]
         public async Task UsingMemoryStreamSlim_CopyFullToAsyncStream_OnManyThreads_CopiesAllDataAsync ()
         {
             int[] testDataSizes = GenerateTestDataSizes(1000, 0xF_FFFF).ToArray();
-            int testLoops = RandomSource.GetRandomInteger(MinimumTestLoops, MaximumTestLoops + 1);
 
             ExceptionDispatchInfo? taskException = null;
 
-
             Task[] runningTasks = Enumerable.Range(0, Math.Max(8, Environment.ProcessorCount * 2)).Select(_ => Task.Run(async () =>
             {
                 try
                 {
                     foreach (int testSegmentSize in TestSegmentSizes)
-                        for (int testLoop = 0; testLoop < testLoops; testLoop++)
+                        for (int testLoop = 0; testLoop < MaximumTestLoops; testLoop++)
                         {
                             int byteCount = testDataSizes[RandomSource.GetRandomInteger(testDataSizes.Length)];
                             await using MemoryStreamSlim testService = CreateTestService(byteCount);
@@ -562,7 +602,11 @@ public async Task UsingMemoryStreamSlim_CopyFullToAsyncStream_OnManyThreads_Copi
                             fileStream.Length.Should().Be(byteCount);
                             // Verify the contents - suspend any async delays
                             using SuspendFileStreamAsyncDelay verifySuspendScope = fileStream.SuspendAsyncDelay();
-                            await VerifyContentsFromStartToEndInBlocksAsync(fileStream, dataCopy, 0x61);
+                            // Alternate how we verify the data
+                            if (0 == (testLoop & 1))
+                                await VerifyContentsFromStartToEndOneReadAsync(fileStream, dataCopy);
+                            else
+                                await VerifyContentsFromStartToEndInBlocksAsync(fileStream, dataCopy, 0x61);
                         }
                 }
                 catch (Exception error)
@@ -579,6 +623,7 @@ public async Task UsingMemoryStreamSlim_CopyFullToAsyncStream_OnManyThreads_Copi
         /// stream is correct. is identical to the data written.
         /// </summary>
         [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.MedRun)]
         public void UsingMemoryStreamSlim_CopyToLargerStream_CopiesCorrectData ()
         {
             int[] testDataSizes = GenerateTestDataSizes(1000, 0xF_FFFF).ToArray();
@@ -625,6 +670,7 @@ public void UsingMemoryStreamSlim_CopyToLargerStream_CopiesCorrectData ()
         /// stream is correct.
         /// </summary>
         [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.MedRun)]
         public async Task UsingMemoryStreamSlim_CopyToLargerStream_CopiesCorrectDataAsync ()
         {
             int[] testDataSizes = GenerateTestDataSizes(1000, 0xF_FFFF).ToArray();
@@ -667,10 +713,76 @@ public async Task UsingMemoryStreamSlim_CopyToLargerStream_CopiesCorrectDataAsyn
         }
         //--------------------------------------------------------------------------------    
         /// <summary>
+        /// Tests writing data to a larger stream and verifying that the contents of the other 
+        /// stream is correct.
+        /// </summary>
+        [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.LongRun)]
+        public async Task UsingMemoryStreamSlim_CopyToLargerStream_OnManyThreads_CopiesCorrectDataAsync ()
+        {
+            int[] testDataSizes = GenerateTestDataSizes(1000, 0xF_FFFF).ToArray();
+
+
+            ExceptionDispatchInfo? taskException = null;
+
+            Task[] runningTasks = Enumerable.Range(0, Math.Max(8, Environment.ProcessorCount * 2)).Select(_ => Task.Run(async () =>
+            {
+                try
+                {
+                    foreach (int testSegmentSize in TestSegmentSizes)
+                        for (int testLoop = 0; testLoop < MaximumTestLoops; testLoop++)
+                        {
+                            int byteCount = testDataSizes[RandomSource.GetRandomInteger(testDataSizes.Length)];
+                            await using MemoryStreamSlim testService = CreateTestService(byteCount);
+                            TestWriteLine($"Running test loop {testLoop} with byte count of {byteCount} and segment size {testSegmentSize}");
+
+                            // Fill the stream with random bytes
+                            byte[] dataCopy =
+                                await MemoryTestPrep.FillStreamAndArrayWithRandomBytesAsync(testService, byteCount, testSegmentSize);
+                            using MemoryStream memoryStream = new MemoryStream();
+                            byte[] otherDataCopy =
+                                await MemoryTestPrep.FillStreamAndArrayWithRandomBytesAsync(memoryStream, GetTestInteger(byteCount + 1, byteCount + 0x10_0000), testSegmentSize);
+
+                            // How much data do we want to write?
+                            int copySourceFrom = GetTestInteger(Math.Max(0, (byteCount > 10) ? byteCount - GetTestInteger(byteCount - 10) : byteCount));
+                            int copyCount = dataCopy.Length - copySourceFrom;
+                            int copyDestFrom = GetTestInteger(otherDataCopy.Length - copyCount);
+                            TestWriteLine($"  Destination stream size is {otherDataCopy.Length}, Copy Count = {copyCount}, Source Offset = {copySourceFrom}, Dest Offset = {copyDestFrom}");
+
+                            // Copy the data to the memory stream
+                            testService.Seek(copySourceFrom, SeekOrigin.Begin);
+                            memoryStream.Seek(copyDestFrom, SeekOrigin.Begin);
+
+                            // Copy to the memory stream
+                            await testService.CopyToAsync(memoryStream);
+                            testService.Position.Should().Be(testService.Length);
+                            memoryStream.Position.Should().Be(copyDestFrom + copyCount);
+                            memoryStream.Length.Should().Be(otherDataCopy.Length);
+                            // Update the expected data copy
+                            Array.Copy(dataCopy, copySourceFrom, otherDataCopy, copyDestFrom, copyCount);
+                            // Verify the contents
+                            // Alternate how we verify the data
+                            if (0 == (testLoop & 1))
+                                await VerifyContentsFromStartToEndOneReadAsync(memoryStream, otherDataCopy);
+                            else
+                                await VerifyContentsFromStartToEndInBlocksAsync(memoryStream, otherDataCopy, 0x61);
+                        }
+                }
+                catch (Exception error)
+                {
+                    taskException ??= ExceptionDispatchInfo.Capture(error);
+                }
+            })).ToArray();
+            await Task.WhenAll(runningTasks);
+            taskException?.Throw();
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
         /// Tests writing data to a larger asynchronous stream and verifying that the contents of the other 
         /// stream is correct.
         /// </summary>
         [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.MedRun)]
         public async Task UsingMemoryStreamSlim_CopyToLargerAsyncStream_CopiesCorrectDataAsync ()
         {
             int[] testDataSizes = GenerateTestDataSizes(1000, 0xF_FFFF).ToArray();
@@ -724,11 +836,10 @@ public async Task UsingMemoryStreamSlim_CopyToLargerAsyncStream_CopiesCorrectDat
         /// stream is correct.
         /// </summary>
         [Fact]
-        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.MedRun)]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.LongRun)]
         public async Task UsingMemoryStreamSlim_CopyToLargerAsyncStream_OnManyThreads_CopiesCorrectDataAsync ()
         {
             int[] testDataSizes = GenerateTestDataSizes(1000, 0xF_FFFF).ToArray();
-            int testLoops = RandomSource.GetRandomInteger(MinimumTestLoops, MaximumTestLoops + 1);
 
             ExceptionDispatchInfo? taskException = null;
 
@@ -737,7 +848,7 @@ public async Task UsingMemoryStreamSlim_CopyToLargerAsyncStream_OnManyThreads_Co
                 try
                 {
                     foreach (int testSegmentSize in TestSegmentSizes)
-                        for (int testLoop = 0; testLoop < testLoops; testLoop++)
+                        for (int testLoop = 0; testLoop < MaximumTestLoops; testLoop++)
                         {
                             int byteCount = testDataSizes[RandomSource.GetRandomInteger(testDataSizes.Length)];
                             await using MemoryStreamSlim testService = CreateTestService(byteCount);
@@ -775,7 +886,11 @@ public async Task UsingMemoryStreamSlim_CopyToLargerAsyncStream_OnManyThreads_Co
                             Array.Copy(dataCopy, copySourceFrom, otherDataCopy, copyDestFrom, copyCount);
                             // Verify the contents - suspend any async delays
                             using SuspendFileStreamAsyncDelay verifySuspendScope = fileStream.SuspendAsyncDelay();
-                            await VerifyContentsFromStartToEndInBlocksAsync(fileStream, otherDataCopy, 0x61);
+                            // Alternate how we verify the data
+                            if (0 == (testLoop & 1))
+                                await VerifyContentsFromStartToEndOneReadAsync(fileStream, otherDataCopy);
+                            else
+                                await VerifyContentsFromStartToEndInBlocksAsync(fileStream, otherDataCopy, 0x61);
                         }
                 }
                 catch (Exception error)
@@ -880,6 +995,70 @@ public async Task UsingMemoryStreamSlim_CopyToSmallerStream_CopiesCorrectDataAsy
         }
         //--------------------------------------------------------------------------------    
         /// <summary>
+        /// Tests writing data to a smaller stream and verifying that the contents of the other 
+        /// stream is correct.
+        /// </summary>
+        [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.MedRun)]
+        public async Task UsingMemoryStreamSlim_CopyToSmallerStream_OnManyThreads_CopiesCorrectDataAsync ()
+        {
+            int[] testDataSizes = GenerateTestDataSizes(1000, 0xF_FFFF).ToArray();
+
+            ExceptionDispatchInfo? taskException = null;
+
+            Task[] runningTasks = Enumerable.Range(0, Math.Max(8, Environment.ProcessorCount * 2)).Select(_ => Task.Run(async () =>
+            {
+                try
+                {
+                    foreach (int testSegmentSize in TestSegmentSizes)
+                        for (int testLoop = 0; testLoop < MaximumTestLoops; testLoop++)
+                        {
+                            int byteCount = testDataSizes[RandomSource.GetRandomInteger(testDataSizes.Length)];
+                            await using MemoryStreamSlim testService = CreateTestService(byteCount);
+                            TestWriteLine($"Running test loop {testLoop} with byte count of {byteCount} and segment size {testSegmentSize}");
+
+                            // Fill the stream with random bytes
+                            byte[] dataCopy =
+                                await MemoryTestPrep.FillStreamAndArrayWithRandomBytesAsync(testService, byteCount, testSegmentSize);
+                            using MemoryStream memoryStream = new MemoryStream();
+                            byte[] otherDataCopy =
+                                await MemoryTestPrep.FillStreamAndArrayWithRandomBytesAsync(memoryStream, GetTestInteger(byteCount / 2, byteCount), testSegmentSize);
+
+                            // How much data do we want to write?
+                            int copyDestFrom = GetTestInteger(Math.Max(0, otherDataCopy.Length - GetTestInteger(Math.Min(otherDataCopy.Length, 10), Math.Max(11, otherDataCopy.Length - 10))));
+                            int copyCount = otherDataCopy.Length - copyDestFrom;
+                            int copySourceFrom = byteCount - copyCount;
+                            TestWriteLine($"  Destination stream size is {otherDataCopy.Length}, Copy Count = {copyCount}, Source Offset = {copySourceFrom}, Dest Offset = {copyDestFrom}");
+
+                            // Copy the data to the memory stream
+                            testService.Seek(copySourceFrom, SeekOrigin.Begin);
+                            memoryStream.Seek(copyDestFrom, SeekOrigin.Begin);
+
+                            // Copy to the memory stream
+                            await testService.CopyToAsync(memoryStream);
+                            testService.Position.Should().Be(copySourceFrom + copyCount);
+                            memoryStream.Position.Should().Be(memoryStream.Length);
+                            memoryStream.Length.Should().Be(otherDataCopy.Length);
+                            // Update the expected data copy
+                            Array.Copy(dataCopy, copySourceFrom, otherDataCopy, copyDestFrom, copyCount);
+                            // Verify the contents
+                            // Alternate how we verify the data
+                            if (0 == (testLoop & 1))
+                                await VerifyContentsFromStartToEndOneReadAsync(memoryStream, otherDataCopy);
+                            else
+                                await VerifyContentsFromStartToEndInBlocksAsync(memoryStream, otherDataCopy, 0x61);
+                        }
+                }
+                catch (Exception error)
+                {
+                    taskException ??= ExceptionDispatchInfo.Capture(error);
+                }
+            })).ToArray();
+            await Task.WhenAll(runningTasks);
+            taskException?.Throw();
+        }
+        //--------------------------------------------------------------------------------    
+        /// <summary>
         /// Tests writing data to a smaller asynchronous stream and verifying that the contents of the other 
         /// stream is correct.
         /// </summary>
@@ -941,8 +1120,6 @@ public async Task UsingMemoryStreamSlim_CopyToSmallerAsyncStream_CopiesCorrectDa
         public async Task UsingMemoryStreamSlim_CopyToSmallerAsyncStream_OnManyThreads_CopiesCorrectDataAsync ()
         {
             int[] testDataSizes = GenerateTestDataSizes(1000, 0xF_FFFF).ToArray();
-            int testLoops = RandomSource.GetRandomInteger(MinimumTestLoops, MaximumTestLoops + 1);
-
 
             ExceptionDispatchInfo? taskException = null;
 
@@ -951,7 +1128,7 @@ public async Task UsingMemoryStreamSlim_CopyToSmallerAsyncStream_OnManyThreads_C
                 try
                 {
                     foreach (int testSegmentSize in TestSegmentSizes)
-                        for (int testLoop = 0; testLoop < testLoops; testLoop++)
+                        for (int testLoop = 0; testLoop < MaximumTestLoops; testLoop++)
                         {
                             int byteCount = testDataSizes[RandomSource.GetRandomInteger(testDataSizes.Length)];
                             await using MemoryStreamSlim testService = CreateTestService(byteCount);
@@ -989,7 +1166,11 @@ public async Task UsingMemoryStreamSlim_CopyToSmallerAsyncStream_OnManyThreads_C
                             Array.Copy(dataCopy, copySourceFrom, otherDataCopy, copyDestFrom, copyCount);
                             // Verify the contents - suspend any async delays
                             using SuspendFileStreamAsyncDelay verifySuspendScope = fileStream.SuspendAsyncDelay();
-                            await VerifyContentsFromStartToEndInBlocksAsync(fileStream, otherDataCopy, 0x61);
+                            // Alternate how we verify the data
+                            if (0 == (testLoop & 1))
+                                await VerifyContentsFromStartToEndOneReadAsync(fileStream, otherDataCopy);
+                            else
+                                await VerifyContentsFromStartToEndInBlocksAsync(fileStream, otherDataCopy, 0x61);
                         }
                 }
                 catch (Exception error)
@@ -1040,7 +1221,7 @@ public void UsingMemoryStreamSlim_WriteToStream_CopiesAllData ()
         /// verifying that the contents of the stream are consistent.
         /// </summary>
         [Fact]
-        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.MedRun)]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.LongRun)]
         public void UsingMemoryStreamSlim_WriteWithChaos_WritesCorrectData ()
         {
             int[] testDataSizes = GenerateTestDataSizes(MemorySegmentedBufferGroup.StandardBufferSegmentSize, MemorySegmentedBufferGroup.StandardBufferSegmentSize * 20).ToArray();
@@ -1166,7 +1347,7 @@ void SeekStream (MemoryStreamSlim stream, int maxPosition, ref int dataCopyArray
 
                     case 3:
                         {
-                            long newOffset = (0 == stream.Length) ? 0 : -RandomSource.GetRandomInteger(stream.Length);
+                            long newOffset = (0 == stream.Length) ? 0 : -RandomSource.GetRandomLongInteger(stream.Length);
                             dataCopyArrayPosition = (int)(stream.Length + newOffset);
                             stream.Seek(newOffset, SeekOrigin.End);
                         }
@@ -1189,6 +1370,178 @@ void SetStreamLength (MemoryStreamSlim stream, int maxPosition, byte[] dataCopyA
             }
         }
         //--------------------------------------------------------------------------------    
+        /// <summary>
+        /// Tests jumping around the stream space and randomly writing data to the stream and 
+        /// verifying that the contents of the stream are consistent.
+        /// </summary>
+        [Fact]
+        [Trait(TestConstants.TestTrait.TimeGenre, TestConstants.TimeGenreName.LongRun)]
+        public async Task UsingMemoryStreamSlim_WriteWithChaos_OnManyThreads_WritesCorrectData ()
+        {
+            int[] testDataSizes = GenerateTestDataSizes(MemorySegmentedBufferGroup.StandardBufferSegmentSize, MemorySegmentedBufferGroup.StandardBufferSegmentSize * 20).ToArray();
+            int testLoops = RandomSource.GetRandomInteger(MinimumRandomPositionTestLoops / 8, MaximumRandomPositionTestLoops / 8);
+
+            ExceptionDispatchInfo? taskException = null;
+
+            Task[] runningTasks = Enumerable.Range(0, Math.Max(8, Environment.ProcessorCount * 2)).Select(_ => Task.Run(async () =>
+            {
+                try
+                {
+                    foreach (int testSegmentSize in TestSegmentSizes)
+                        for (int testLoop = 0; testLoop < testLoops; testLoop++)
+                        {
+                            int byteCount = testDataSizes[RandomSource.GetRandomInteger(testDataSizes.Length)];
+                            using MemoryStreamSlim testService = CreateTestService(byteCount);
+                            TestWriteLine($"Running test loop {testLoop} with byte count of {byteCount} and segment size {testSegmentSize}");
+
+                            // Get an array to compare the results to
+                            byte[] dataCopy = new byte[byteCount];
+                            // For fixed mode streams, we should start with the expected data array to be the same data as the initial stream contents
+                            if (testService.Mode == MemoryStreamSlimMode.Fixed)
+                                testService.Read(dataCopy, 0, byteCount);
+                            int dataCopyIndexPosition = 0;
+
+                            for (int chaosIndex = 0; chaosIndex < 1000; chaosIndex++)
+                            {
+                                switch (GetTestInteger() % 4)
+                                {
+                                    case 0:
+                                        WriteArrayDataToStream(testService, dataCopy, ref dataCopyIndexPosition);
+                                        break;
+
+                                    case 1:
+                                        WriteSpanDataToStream(testService, dataCopy, ref dataCopyIndexPosition);
+                                        break;
+
+                                    case 2:
+                                        WriteByteDataToStream(testService, dataCopy, ref dataCopyIndexPosition);
+                                        break;
+
+                                    case 3:
+                                        PositionStream(testService, byteCount, out dataCopyIndexPosition);
+                                        break;
+
+                                    case 4:
+                                        SeekStream(testService, byteCount, ref dataCopyIndexPosition);
+                                        break;
+
+                                    case 5:
+                                        SetStreamLength(testService, byteCount, dataCopy);
+                                        break;
+                                }
+                            }
+                            // Verify the contents
+                            testService.SetLength(Math.Max(testService.Length, dataCopy.Length));
+                            // Alternate how we verify the data
+                            if (0 == (testLoop & 1))
+                                await VerifyContentsFromStartToEndOneReadAsync(testService, dataCopy);
+                            else
+                                await VerifyContentsFromStartToEndInBlocksAsync(testService, dataCopy, 0x61);
+                        }
+
+                    void WriteArrayDataToStream (MemoryStreamSlim stream, byte[] dataCopyArray, ref int dataCopyArrayPosition)
+                    {
+                        int writePosition = (int)stream.Position;
+                        int spaceLeft = dataCopyArray.Length - writePosition;
+                        int byteCount = (spaceLeft < 10) ? spaceLeft : RandomSource.GetRandomInteger(1, spaceLeft / 2);
+                        byte[] writeData = MemoryTestPrep.GetRandomByteArray(byteCount);
+
+                        stream.Write(writeData);
+                        Array.Copy(writeData, 0, dataCopyArray, dataCopyArrayPosition, byteCount);
+                        dataCopyArrayPosition += byteCount;
+                    }
+
+                    void WriteSpanDataToStream (MemoryStreamSlim stream, byte[] dataCopyArray, ref int dataCopyArrayPosition)
+                    {
+                        int writePosition = (int)stream.Position;
+                        int spaceLeft = dataCopyArray.Length - writePosition;
+                        int byteCount = (spaceLeft < 10) ? spaceLeft : RandomSource.GetRandomInteger(1, spaceLeft / 2);
+                        byte[] writeData = MemoryTestPrep.GetRandomByteArray(byteCount);
+
+                        stream.Write(writeData.AsSpan());
+                        Array.Copy(writeData, 0, dataCopyArray, dataCopyArrayPosition, byteCount);
+                        dataCopyArrayPosition += byteCount;
+                    }
+
+                    void WriteByteDataToStream (MemoryStreamSlim stream, byte[] dataCopyArray, ref int dataCopyArrayPosition)
+                    {
+                        int writePosition = (int)stream.Position;
+                        int spaceLeft = dataCopyArray.Length - writePosition;
+                        if (spaceLeft < 1)
+                            return;
+                        byte writeData = GetRandomByte();
+                        stream.WriteByte(writeData);
+                        dataCopyArray[dataCopyArrayPosition++] = writeData;
+                    }
+
+                    void PositionStream (MemoryStreamSlim stream, int maxPosition, out int dataCopyArrayPosition)
+                    {
+                        int newPosition = (0 == maxPosition) ? 0 : RandomSource.GetRandomInteger(maxPosition);
+                        stream.Position = dataCopyArrayPosition = newPosition;
+                    }
+
+                    void SeekStream (MemoryStreamSlim stream, int maxPosition, ref int dataCopyArrayPosition)
+                    {
+                        int currentPosition = (int)stream.Position;
+
+                        switch (RandomSource.GetRandomInteger(4))
+                        {
+                            case 0:
+                                {
+                                    int newPosition = dataCopyArrayPosition = (0 == maxPosition) ? 0 : RandomSource.GetRandomInteger(maxPosition);
+                                    stream.Seek(newPosition, SeekOrigin.Begin);
+                                }
+                                break;
+
+                            case 1:
+                                {
+                                    int newOffset = (currentPosition == maxPosition) ? 0 : RandomSource.GetRandomInteger(maxPosition - currentPosition);
+                                    dataCopyArrayPosition += newOffset;
+                                    stream.Seek(newOffset, SeekOrigin.Current);
+                                }
+                                break;
+
+                            case 2:
+                                {
+                                    int newOffset = (0 == currentPosition) ? 0 : -RandomSource.GetRandomInteger(currentPosition);
+                                    dataCopyArrayPosition += newOffset;
+                                    stream.Seek(newOffset, SeekOrigin.Current);
+                                }
+                                break;
+
+                            case 3:
+                                {
+                                    long newOffset = (0 == stream.Length) ? 0 : -RandomSource.GetRandomLongInteger(stream.Length);
+                                    dataCopyArrayPosition = (int)(stream.Length + newOffset);
+                                    stream.Seek(newOffset, SeekOrigin.End);
+                                }
+                                break;
+                        }
+                    }
+
+                    void SetStreamLength (MemoryStreamSlim stream, int maxPosition, byte[] dataCopyArray)
+                    {
+                        int currentLength = (int)stream.Length;
+                        int newLength = (maxPosition < 2) ? maxPosition : RandomSource.GetRandomInteger(2, maxPosition);
+
+                        // Do we need to clear data in the copy?
+                        if ((stream.Mode == MemoryStreamSlimMode.Dynamic) && (newLength < currentLength))
+                        {
+                            Array.Clear(dataCopyArray, newLength, currentLength - newLength);
+                        }
+
+                        stream.SetLength(newLength);
+                    }
+                }
+                catch (Exception error)
+                {
+                    taskException ??= ExceptionDispatchInfo.Capture(error);
+                }
+            })).ToArray();
+            await Task.WhenAll(runningTasks);
+            taskException?.Throw();
+        }
+        //--------------------------------------------------------------------------------    
 
         //================================================================================
 
diff --git a/Source/linuxtest.dockerfile b/Source/linuxtest.dockerfile
index b257721..95c932e 100644
--- a/Source/linuxtest.dockerfile
+++ b/Source/linuxtest.dockerfile
@@ -21,4 +21,4 @@ RUN dotnet restore
 RUN dotnet build --no-restore
 
 # Run the tests
-CMD ["dotnet", "test", "--no-build", "--filter", "Model!=Concurrency", "--logger", "xunit;LogFileName={assembly}.{framework}.results.xml", "--results-directory", "/app/Tst/linux-tests-results"]
+CMD ["dotnet", "test", "--no-build", "--logger", "xunit;LogFileName={assembly}.{framework}.results.xml", "--results-directory", "/app/Tst/linux-tests-results"]