From 8984a3fac0080eb92a1251b9cb0a6b3af80078f2 Mon Sep 17 00:00:00 2001 From: mlemanczyk Date: Sun, 15 Jan 2023 12:23:46 +0100 Subject: [PATCH] Additional, optimized constructors & AddRange variants added to RecyclableArrayList. Benchmarks extended. --- .../ListVsLinkedListBenchmarks.cs | 6 + Recyclable.Collections.Benchmarks/Program.cs | 4 +- .../RecyclableCollectionsBenchmarks.Array.cs | 35 +- .../RecyclableCollectionsBenchmarks.List.cs | 62 ++-- ...llectionsBenchmarks.RecyclableArrayList.cs | 68 +++- ...bleCollectionsBenchmarks.RecyclableList.cs | 4 +- .../RefVsInstanceMemberBenchmarks.cs | 298 +++++++++++++++++- Recyclable.Collections/RecyclableArrayList.cs | 57 +++- .../RecyclableArrayList_CreateBenchmarks.png | Bin 25262 -> 22660 bytes Recyclable.Collections/RecyclableDefaults.cs | 2 +- .../RecyclableListExtensions.cs | 23 +- 11 files changed, 484 insertions(+), 75 deletions(-) diff --git a/Recyclable.Collections.Benchmarks/ListVsLinkedListBenchmarks.cs b/Recyclable.Collections.Benchmarks/ListVsLinkedListBenchmarks.cs index 52d8471..579a4d8 100644 --- a/Recyclable.Collections.Benchmarks/ListVsLinkedListBenchmarks.cs +++ b/Recyclable.Collections.Benchmarks/ListVsLinkedListBenchmarks.cs @@ -14,6 +14,12 @@ protected object[]? _testObjects; protected object[] TestObjects => _testObjects ??= Enumerable.Range(1, TestObjectCount).Select(x => new object()).ToArray(); + private List? _testObjectsAsList; + protected List TestObjectsAsList => _testObjectsAsList ??= TestObjects.ToList(); + + private RecyclableArrayList? _testObjectsAsRecyclableArrayList; + protected RecyclableArrayList TestObjectsAsRecyclableArrayList => _testObjectsAsRecyclableArrayList ??= TestObjects.ToRecyclableArrayList(); + protected static void DoNothing(T obj) { _ = obj; diff --git a/Recyclable.Collections.Benchmarks/Program.cs b/Recyclable.Collections.Benchmarks/Program.cs index 52450ac..c9eba31 100644 --- a/Recyclable.Collections.Benchmarks/Program.cs +++ b/Recyclable.Collections.Benchmarks/Program.cs @@ -3,8 +3,8 @@ using Recyclable.Collections.Benchmarks; //BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(new[] { "-f*" }); -BenchmarkRunner.Run(); -//BenchmarkRunner.Run(); +//BenchmarkRunner.Run(); +BenchmarkRunner.Run(); //var benchmark = new RecyclableCollectionsBenchmarks(); //benchmark.RecyclableArrayList_AddRange_WithCapacity(); diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.Array.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.Array.cs index b87abe3..d82524b 100644 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.Array.cs +++ b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.Array.cs @@ -7,27 +7,17 @@ namespace Recyclable.Collections.Benchmarks { private readonly object[] _testArray; - //[Benchmark(Baseline = true)] + [Benchmark(Baseline = false)] public void Array_Create_WithCapacity() { - DoNothing(new object[TestObjectCount]); + var data = new object[TestObjectCount]; + DoNothing(data); } - //[Benchmark] - public void Array_GetItem() - { - var data = _testArray; - var dataCount = TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(data[i]); - } - } - - //[Benchmark] + [Benchmark(Baseline = true)] public void Array_SetItem() { - var data = _testArray; + var data = TestObjects; var dataCount = TestObjectCount; for (var i = 0; i < dataCount; i++) { @@ -35,14 +25,25 @@ namespace Recyclable.Collections.Benchmarks } } - //[Benchmark] + [Benchmark] + public void Array_GetItem() + { + var data = TestObjects; + var dataCount = TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(data[i]); + } + } + + [Benchmark] public void Array_Count() { var data = _testArray; DoNothing(data.Length); } - //[Benchmark] + [Benchmark] public void Array_LongCount() { var data = _testArray; diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.List.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.List.cs index af73248..766a3b3 100644 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.List.cs +++ b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.List.cs @@ -6,7 +6,7 @@ namespace Recyclable.Collections.Benchmarks { private readonly List _testList; - //[Benchmark(Baseline = true)] + //[Benchmark(Baseline = false)] public void List_Create() { var list = new List(); @@ -27,7 +27,7 @@ namespace Recyclable.Collections.Benchmarks DoNothing(list); } - //[Benchmark] + [Benchmark] public void List_Add() { var data = TestObjects; @@ -39,7 +39,7 @@ namespace Recyclable.Collections.Benchmarks } } - //[Benchmark(Baseline = true)] + [Benchmark(Baseline = false)] public void List_Add_WithCapacity() { var data = TestObjects; @@ -52,14 +52,38 @@ namespace Recyclable.Collections.Benchmarks } [Benchmark] - public void List_AddRange() + public void List_AddRangeWhenSourceIsArray() { var data = TestObjects; var list = new List(); list.AddRange(data); } - [Benchmark(Baseline = true)] + [Benchmark] + public void List_AddRangeWhenSourceIsList() + { + var data = TestObjectsAsList; + var list = new List(); + list.AddRange(data); + } + + [Benchmark] + public void List_AddRangeWhenSourceIsIList() + { + var data = (IList)TestObjectsAsList; + var list = new List(); + list.AddRange(data); + } + + [Benchmark] + public void List_AddRangeWhenSourceIsIEnumerable() + { + var data = (IEnumerable)TestObjects; + var list = new List(); + list.AddRange(data); + } + + [Benchmark(Baseline = false)] public void List_AddRange_WithCapacity() { var data = TestObjects; @@ -68,21 +92,10 @@ namespace Recyclable.Collections.Benchmarks list.AddRange(data); } - //[Benchmark] - public void List_GetItem() - { - var data = _testList; - var dataCount = TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(data[i]); - } - } - - //[Benchmark] + [Benchmark] public void List_SetItem() { - var data = _testList; + var data = TestObjectsAsList; var dataCount = TestObjectCount; for (var i = 0; i < dataCount; i++) { @@ -90,7 +103,18 @@ namespace Recyclable.Collections.Benchmarks } } - //[Benchmark] + [Benchmark] + public void List_GetItem() + { + var data = TestObjectsAsList; + var dataCount = TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(data[i]); + } + } + + [Benchmark] public void List_Count() { var data = _testList; diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableArrayList.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableArrayList.cs index 5451f76..08d3f16 100644 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableArrayList.cs +++ b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableArrayList.cs @@ -41,7 +41,7 @@ namespace Recyclable.Collections.Benchmarks DoNothing(list); } - //[Benchmark] + [Benchmark] public void RecyclableArrayList_Add() { var data = TestObjects; @@ -53,7 +53,7 @@ namespace Recyclable.Collections.Benchmarks } } - //[Benchmark] + [Benchmark] public void RecyclableArrayList_Add_WithCapacity() { var data = TestObjects; @@ -66,13 +66,45 @@ namespace Recyclable.Collections.Benchmarks } [Benchmark] - public void RecyclableArrayList_AddRange() + public void RecyclableArrayList_AddRangeWhenSourceIsArray() { var data = TestObjects; using var list = new RecyclableArrayList(); list.AddRange(data); } + [Benchmark] + public void RecyclableArrayList_AddRangeWhenSourceIsList() + { + var data = TestObjectsAsList; + using var list = new RecyclableArrayList(); + list.AddRange(data); + } + + [Benchmark] + public void RecyclableArrayList_AddRangeWhenSourceIsIList() + { + var data = (IList)TestObjectsAsList; + using var list = new RecyclableArrayList(); + list.AddRange(data); + } + + [Benchmark] + public void RecyclableArrayList_AddRangeWhenSourceIsIEnumerable() + { + var data = (IEnumerable)TestObjects; + using var list = new RecyclableArrayList(); + list.AddRange(data); + } + + [Benchmark] + public void RecyclableArrayList_AddRangeWhenSourceIsRecyclableArrayList() + { + var data = TestObjectsAsRecyclableArrayList; + using var list = new RecyclableArrayList(); + list.AddRange(data); + } + [Benchmark] public void RecyclableArrayList_AddRange_WithCapacity() { @@ -82,10 +114,23 @@ namespace Recyclable.Collections.Benchmarks list.AddRange(data); } - //[Benchmark] + [Benchmark] + public void RecyclableArrayList_SetItem() + { + var data = TestObjectsAsRecyclableArrayList; + var dataCount = TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + data[i] = TestObjects[i]; + } + + data.Count = dataCount; + } + + [Benchmark] public void RecyclableArrayList_GetItem() { - var data = _testRecyclableArrayList; + var data = TestObjectsAsRecyclableArrayList; var dataCount = TestObjectCount; for (var i = 0; i < dataCount; i++) { @@ -93,18 +138,7 @@ namespace Recyclable.Collections.Benchmarks } } - //[Benchmark] - public void RecyclableArrayList_SetItem() - { - var data = _testRecyclableArrayList; - var dataCount = TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - data[i] = TestObjects[i]; - } - } - - //[Benchmark] + [Benchmark] public void RecyclableArrayList_Count() { var data = _testRecyclableArrayList; diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableList.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableList.cs index 27ff894..d6a166c 100644 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableList.cs +++ b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableList.cs @@ -27,7 +27,7 @@ namespace Recyclable.Collections.Benchmarks DoNothing(list); } - [Benchmark] + //[Benchmark] public void RecyclableList_Add() { var data = TestObjects; @@ -39,7 +39,7 @@ namespace Recyclable.Collections.Benchmarks } } - [Benchmark] + //[Benchmark] public void RecyclableList_Add_WithCapacity() { var data = TestObjects; diff --git a/Recyclable.Collections.Benchmarks/RefVsInstanceMemberBenchmarks.cs b/Recyclable.Collections.Benchmarks/RefVsInstanceMemberBenchmarks.cs index ed3c1b3..2851a58 100644 --- a/Recyclable.Collections.Benchmarks/RefVsInstanceMemberBenchmarks.cs +++ b/Recyclable.Collections.Benchmarks/RefVsInstanceMemberBenchmarks.cs @@ -18,14 +18,27 @@ namespace Recyclable.Collections.Benchmarks private class TestCase { + private int[] _items = new int[123]; private int _count = 123; + private int Add(int count) + { + return count; + } + public int Count { get => _count; set => _count = value; } - public ref int GetRefCount() + public ref int GetCountAsRefCount2() + { + ref int count = ref _count; + count = 234; + return ref count; + } + + public ref int GetCountAsRefCount3() { ref int count = ref _count; count = 234; @@ -33,30 +46,299 @@ namespace Recyclable.Collections.Benchmarks return ref count; } - private int Add(int count) + public ref int GetCountAsRefCount4() { - return count; + ref int count = ref _count; + count = 234; + _ = Add(count); + _ = Add(count); + return ref count; } - public int GetCount() + public ref int GetCountAsRefCount5() + { + ref int count = ref _count; + count = 234; + _ = Add(count); + _ = Add(count); + _ = Add(count); + return ref count; + } + + public int GetCountAsInstanceMember2() + { + _count = 234; + return _count; + } + + public int GetCountAsInstanceMember3() { _count = 234; _ = Add(_count); return _count; } + + public int GetCountAsInstanceMember4() + { + _count = 234; + _ = Add(_count); + _ = Add(_count); + return _count; + } + + public int GetCountAsInstanceMember5() + { + _count = 234; + _ = Add(_count); + _ = Add(_count); + _ = Add(_count); + return _count; + } + + public int GetLengthAsArray2() + { + _ = Add(_items.Length); + return _items.Length; + } + + public int GetLengthAsArray3() + { + _ = Add(_items.Length); + _ = Add(_items.Length); + return _items.Length; + } + + public int GetLengthAsArray4() + { + _ = Add(_items.Length); + _ = Add(_items.Length); + _ = Add(_items.Length); + return _items.Length; + } + + public int GetLengthAsArray5() + { + _ = Add(_items.Length); + _ = Add(_items.Length); + _ = Add(_items.Length); + _ = Add(_items.Length); + return _items.Length; + } + + public int GetLengthAsArray6() + { + _ = Add(_items.Length); + _ = Add(_items.Length); + _ = Add(_items.Length); + _ = Add(_items.Length); + _ = Add(_items.Length); + return _items.Length; + } + + public int GetLengthAsArrayLocalVar5() + { + var items = _items; + _ = Add(items.Length); + _ = Add(items.Length); + _ = Add(items.Length); + _ = Add(items.Length); + return items.Length; + } + + public int GetLengthAsArrayLocalVar6() + { + var items = _items; + _ = Add(items.Length); + _ = Add(items.Length); + _ = Add(items.Length); + _ = Add(items.Length); + _ = Add(items.Length); + return items.Length; + } + + public int GetLengthAsRefArray2() + { + ref int[] items = ref _items; + _ = Add(items.Length); + return items.Length; + } + + public int GetLengthAsRefArray3() + { + ref int[] items = ref _items; + _ = Add(items.Length); + _ = Add(items.Length); + return items.Length; + } + + public int GetLengthAsRefArray4() + { + ref int[] items = ref _items; + _ = Add(items.Length); + _ = Add(items.Length); + _ = Add(items.Length); + return items.Length; + } + + public int GetLengthAsRefArray5() + { + ref int[] items = ref _items; + _ = Add(items.Length); + _ = Add(items.Length); + _ = Add(items.Length); + _ = Add(items.Length); + return items.Length; + } + + public int GetLengthAsRefArray6() + { + ref int[] items = ref _items; + _ = Add(items.Length); + _ = Add(items.Length); + _ = Add(items.Length); + _ = Add(items.Length); + _ = Add(items.Length); + return items.Length; + } } [Benchmark] - public void Ref() + public void RefToInt2() { - var count = _testCase.GetRefCount(); + var count = _testCase.GetCountAsRefCount2(); + DoNothing(count); + } + + [Benchmark] + public void RefToInt3() + { + var count = _testCase.GetCountAsRefCount3(); + DoNothing(count); + } + + [Benchmark] + public void RefToInt4() + { + var count = _testCase.GetCountAsRefCount4(); + DoNothing(count); + } + + [Benchmark] + public void RefToInt5() + { + var count = _testCase.GetCountAsRefCount5(); DoNothing(count); } [Benchmark(Baseline = true)] - public void InstanceMember() + public void IntInstanceMember2() { - var count = _testCase.GetCount(); + var count = _testCase.GetCountAsInstanceMember2(); + DoNothing(count); + } + + [Benchmark(Baseline = false)] + public void IntInstanceMember3() + { + var count = _testCase.GetCountAsInstanceMember3(); + DoNothing(count); + } + + [Benchmark(Baseline = false)] + public void IntInstanceMember4() + { + var count = _testCase.GetCountAsInstanceMember4(); + DoNothing(count); + } + + [Benchmark(Baseline = false)] + public void IntInstanceMember5() + { + var count = _testCase.GetCountAsInstanceMember5(); + DoNothing(count); + } + + [Benchmark] + public void RefToArray2() + { + var count = _testCase.GetLengthAsRefArray2(); + DoNothing(count); + } + + [Benchmark] + public void RefToArray3() + { + var count = _testCase.GetLengthAsRefArray3(); + DoNothing(count); + } + + [Benchmark] + public void RefToArray4() + { + var count = _testCase.GetLengthAsRefArray4(); + DoNothing(count); + } + + [Benchmark] + public void RefToArray5() + { + var count = _testCase.GetLengthAsRefArray5(); + DoNothing(count); + } + + [Benchmark] + public void RefToArray6() + { + var count = _testCase.GetLengthAsRefArray6(); + DoNothing(count); + } + + [Benchmark(Baseline = false)] + public void ArrayInstanceMember2() + { + var count = _testCase.GetLengthAsArray2(); + DoNothing(count); + } + + [Benchmark(Baseline = false)] + public void ArrayInstanceMember3() + { + var count = _testCase.GetLengthAsArray3(); + DoNothing(count); + } + + [Benchmark(Baseline = false)] + public void ArrayInstanceMember4() + { + var count = _testCase.GetLengthAsArray4(); + DoNothing(count); + } + + [Benchmark(Baseline = false)] + public void ArrayInstanceMember5() + { + var count = _testCase.GetLengthAsArray5(); + DoNothing(count); + } + + [Benchmark(Baseline = false)] + public void ArrayInstanceMember6() + { + var count = _testCase.GetLengthAsArray6(); + DoNothing(count); + } + + [Benchmark(Baseline = false)] + public void ArrayInstanceMemberLocalVar5() + { + var count = _testCase.GetLengthAsArrayLocalVar5(); + DoNothing(count); + } + + [Benchmark(Baseline = false)] + public void ArrayInstanceMemberLocalVar6() + { + var count = _testCase.GetLengthAsArrayLocalVar6(); DoNothing(count); } } diff --git a/Recyclable.Collections/RecyclableArrayList.cs b/Recyclable.Collections/RecyclableArrayList.cs index 27fa4ea..2542b79 100644 --- a/Recyclable.Collections/RecyclableArrayList.cs +++ b/Recyclable.Collections/RecyclableArrayList.cs @@ -82,7 +82,6 @@ namespace Recyclable.Collections public RecyclableArrayList(int initialCapacity) #pragma warning restore CS8618 { - // _memory will be initialized when the 1st item is added if (initialCapacity > 0) { _memory = SetNewLength(_memory, initialCapacity); @@ -90,6 +89,34 @@ namespace Recyclable.Collections } } +#pragma warning disable CS8618 // _memory will be initialized when the 1st item is added + public RecyclableArrayList(RecyclableArrayList source) +#pragma warning restore CS8618 + { + AddRange(source); + } + +#pragma warning disable CS8618 // _memory will be initialized when the 1st item is added + public RecyclableArrayList(in T[] source) +#pragma warning restore CS8618 + { + AddRange(source); + } + +#pragma warning disable CS8618 // _memory will be initialized when the 1st item is added + public RecyclableArrayList(List source) +#pragma warning restore CS8618 + { + AddRange(source); + } + +#pragma warning disable CS8618 // _memory will be initialized when the 1st item is added + public RecyclableArrayList(IList source) +#pragma warning restore CS8618 + { + AddRange(source); + } + public RecyclableArrayList(IEnumerable source, int initialCapacity = RecyclableDefaults.Capacity) { _memory = SetNewLength(_memory, initialCapacity); @@ -126,7 +153,7 @@ namespace Recyclable.Collections public bool IsReadOnly { get; } = false; - public void Add(in T item) + public void Add(T item) { int requestedCapacity = _count + 1; if (_capacity < requestedCapacity) @@ -152,7 +179,7 @@ namespace Recyclable.Collections _count = targetCapacity; } - public void AddRange(in List items) + public void AddRange(List items) { var sourceItemsCount = items.Count; var targetCapacity = _count + sourceItemsCount; @@ -165,7 +192,20 @@ namespace Recyclable.Collections _count = targetCapacity; } - public void AddRange(in RecyclableArrayList items) + public void AddRange(IList items) + { + var sourceItemsCount = items.Count; + var targetCapacity = _count + sourceItemsCount; + if (_capacity < targetCapacity) + { + _ = EnsureCapacity(targetCapacity); + } + + items.CopyTo(_memory, _count); + _count = targetCapacity; + } + + public void AddRange(RecyclableArrayList items) { var sourceItemsCount = items._count; var targetCapacity = _count + sourceItemsCount; @@ -180,10 +220,17 @@ namespace Recyclable.Collections _count = targetCapacity; } - public void AddRange(IEnumerable source) + public void AddRange(IEnumerable source, int growByCount = 100) { + ref int capacity = ref _capacity; + ref int count = ref _count; foreach (var item in source) { + if (capacity == count) + { + _ = EnsureCapacity(capacity * growByCount); + } + Add(item); } } diff --git a/Recyclable.Collections/RecyclableArrayList_CreateBenchmarks.png b/Recyclable.Collections/RecyclableArrayList_CreateBenchmarks.png index ed3622aa14e7832123c302fce83832e470b6c9cb..b70bdfdfcdd40f538aeda58b7a58a072abcd64d1 100644 GIT binary patch literal 22660 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 literal 25262 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 diff --git a/Recyclable.Collections/RecyclableDefaults.cs b/Recyclable.Collections/RecyclableDefaults.cs index 09e80ce..b7ea187 100644 --- a/Recyclable.Collections/RecyclableDefaults.cs +++ b/Recyclable.Collections/RecyclableDefaults.cs @@ -3,7 +3,7 @@ public class RecyclableDefaults { public const int BlockSize = 10_240; - public const int Capacity = 8; + public const int Capacity = 1; public const int MinPooledArrayLength = 100; } } diff --git a/Recyclable.Collections/RecyclableListExtensions.cs b/Recyclable.Collections/RecyclableListExtensions.cs index 03ae6dc..959c07c 100644 --- a/Recyclable.Collections/RecyclableListExtensions.cs +++ b/Recyclable.Collections/RecyclableListExtensions.cs @@ -121,11 +121,26 @@ namespace Recyclable.Collections return -1; } - //[MethodImpl(MethodImplOptions.AggressiveInlining)] - //public static RecyclableList ToRecyclableList(this IList values, int blockSize = RecyclableDefaults.BlockSize) => new(values, blockSize); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RecyclableList ToRecyclableList(this IList values, int blockSize = RecyclableDefaults.BlockSize) => new(values, blockSize); - //[MethodImpl(MethodImplOptions.AggressiveInlining)] - //public static RecyclableList ToRecyclableList(this IEnumerable values, int blockSize = RecyclableDefaults.BlockSize) => new(values, blockSize); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RecyclableList ToRecyclableList(this List values, int blockSize = RecyclableDefaults.BlockSize) => new(values, blockSize); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RecyclableArrayList ToRecyclableArrayList(this IEnumerable values) => new(values, values.TryGetNonEnumeratedCount(out int count) ? count : RecyclableDefaults.Capacity); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RecyclableArrayList ToRecyclableArrayList(this T[] values) => new(values); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RecyclableArrayList ToRecyclableArrayList(this List values) => new(values); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RecyclableArrayList ToRecyclableArrayList(this RecyclableArrayList values) => new(values); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RecyclableList ToRecyclableList(this IEnumerable values, int blockSize = RecyclableDefaults.BlockSize) => new(values, blockSize); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T[] RentArrayFromPool(this int minSize, ArrayPool arrayPool) => (minSize >= _minPooledArraySize)