diff --git a/Recyclable.Collections.Benchmarks/BenchmarkBase.cs b/Recyclable.Collections.Benchmarks/BenchmarkBase.cs index c1244b2..1c2dbe0 100644 --- a/Recyclable.Collections.Benchmarks/BenchmarkBase.cs +++ b/Recyclable.Collections.Benchmarks/BenchmarkBase.cs @@ -6,7 +6,7 @@ namespace Recyclable.Collections.Benchmarks { //[Params(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 32, 40, 50, 60, 80, 90, 100, 128, 256, 512, 1024, 2048, 4096, 8192, 1_000_000)] //[Params(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 32, 40, 50, 60, 80, 90, 100, 128, 256, 512, 1024, 2048, 4096, 8192, 1_000_000)] - public int TestObjectCount = 1_000_000; + public long TestObjectCount = 1_000_000; //[Params(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200)] //[Params(10, 20, 50, 100)] @@ -15,8 +15,8 @@ namespace Recyclable.Collections.Benchmarks public int BlockSize => TestObjectCount switch { 0 => 1, - > 0 and <= 10 => TestObjectCount, - _ => TestObjectCount / Divider > 0 ? TestObjectCount / Divider : TestObjectCount + > 0 and <= 10 => (int)TestObjectCount, + _ => TestObjectCount / Divider > 0 ? checked((int)(TestObjectCount / Divider)) : checked((int)TestObjectCount) }; protected object[]? _testObjects; @@ -29,7 +29,16 @@ namespace Recyclable.Collections.Benchmarks protected RecyclableArrayList TestObjectsAsRecyclableArrayList => _testObjectsAsRecyclableArrayList ?? throw new NullReferenceException("Something is wrong and the field is not initialized"); protected RecyclableList? _testObjectsAsRecyclableList; protected RecyclableList TestObjectsAsRecyclableList => _testObjectsAsRecyclableList ?? throw new NullReferenceException("Something is wrong and the field is not initialized"); - protected IEnumerable TestObjectsAsIEnumerable => Enumerable.Range(1, TestObjectCount).Select(static x => new object()); + protected IEnumerable TestObjectsAsIEnumerable + { + get + { + for (long i = 0; i < TestObjectCount; i++) + { + yield return new object(); + } + } + } protected static void DoNothing(T obj) { diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.Array.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.Array.cs index 0625abc..4dc11c4 100644 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.Array.cs +++ b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.Array.cs @@ -1,4 +1,5 @@ using BenchmarkDotNet.Attributes; +using MoreLinq.Extensions; namespace Recyclable.Collections.Benchmarks { @@ -17,9 +18,10 @@ namespace Recyclable.Collections.Benchmarks { var data = TestObjects; var dataCount = TestObjectCount; - for (var i = 0; i < dataCount; i++) + long index = 0; + for(var i = 0; i < dataCount; i++) { - data[i] = TestObjects[i]; + data[index] = TestObjects[index++]; } } diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.List.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.List.cs index 91ca294..e7d4615 100644 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.List.cs +++ b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.List.cs @@ -14,7 +14,7 @@ namespace Recyclable.Collections.Benchmarks //[Benchmark(Baseline = false)] public void List_Create_WithCapacity() { - var list = new List(TestObjectCount); + var list = new List(checked((int)TestObjectCount)); DoNothing(list); } @@ -35,7 +35,7 @@ namespace Recyclable.Collections.Benchmarks { var data = TestObjects; var dataCount = TestObjectCount; - var list = new List(dataCount); + var list = new List(checked((int)dataCount)); for (var i = 0; i < dataCount; i++) { list.Add(data[i]); @@ -79,7 +79,7 @@ namespace Recyclable.Collections.Benchmarks { var data = TestObjects; var dataCount = TestObjectCount; - var list = new List(dataCount); + var list = new List(checked((int)dataCount)); list.AddRange(data); } diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.PooledList.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.PooledList.cs index 04243ae..0829c89 100644 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.PooledList.cs +++ b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.PooledList.cs @@ -15,7 +15,7 @@ namespace Recyclable.Collections.Benchmarks //[Benchmark] public void PooledList_Create_WithCapacity() { - using var list = new PooledList(capacity: TestObjectCount); + using var list = new PooledList(capacity: checked((int)TestObjectCount)); DoNothing(list); } @@ -36,7 +36,7 @@ namespace Recyclable.Collections.Benchmarks { var data = TestObjects; var dataCount = TestObjectCount; - using var list = new PooledList(capacity: dataCount); + using var list = new PooledList(capacity: checked((int)dataCount)); for (var i = 0; i < dataCount; i++) { list.Add(data[i]); @@ -47,7 +47,7 @@ namespace Recyclable.Collections.Benchmarks public void PooledList_AddRangeWhenSourceIsArray() { var data = TestObjects; - using var list = new PooledList(capacity: TestObjectCount); + using var list = new PooledList(capacity: checked((int)TestObjectCount)); list.AddRange(data); } @@ -55,7 +55,7 @@ namespace Recyclable.Collections.Benchmarks public void PooledList_AddRangeWhenSourceIsList() { var data = TestObjectsAsList; - using var list = new PooledList(capacity: TestObjectCount); + using var list = new PooledList(capacity: checked((int)TestObjectCount)); list.AddRange(data); } @@ -63,7 +63,7 @@ namespace Recyclable.Collections.Benchmarks public void PooledList_AddRangeWhenSourceIsIList() { var data = (IList)TestObjectsAsPooledList; - using var list = new PooledList(capacity: TestObjectCount); + using var list = new PooledList(capacity: checked((int)TestObjectCount)); list.AddRange(data); } @@ -71,7 +71,7 @@ namespace Recyclable.Collections.Benchmarks public void PooledList_AddRangeWhenSourceIsIEnumerable() { var data = TestObjectsAsIEnumerable; - using var list = new PooledList(capacity: TestObjectCount); + using var list = new PooledList(capacity: checked((int)TestObjectCount)); list.AddRange(data); } @@ -79,7 +79,7 @@ namespace Recyclable.Collections.Benchmarks public void PooledList_AddRangeWhenSourceIsPooledList() { var data = TestObjectsAsPooledList; - using var list = new PooledList(capacity: TestObjectCount); + using var list = new PooledList(capacity: checked((int)TestObjectCount)); list.AddRange(data); } @@ -88,7 +88,7 @@ namespace Recyclable.Collections.Benchmarks { var data = TestObjects; var dataCount = TestObjectCount; - using var list = new PooledList(capacity: TestObjectCount); + using var list = new PooledList(capacity: checked((int)TestObjectCount)); list.AddRange(data); } diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableArrayList.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableArrayList.cs index b5bc74a..02eee54 100644 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableArrayList.cs +++ b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableArrayList.cs @@ -14,7 +14,7 @@ namespace Recyclable.Collections.Benchmarks //[Benchmark] public void RecyclableArrayList_Create_WithCapacity() { - using var list = new RecyclableArrayList(TestObjectCount); + using var list = new RecyclableArrayList(checked((int)TestObjectCount)); DoNothing(list); } @@ -35,7 +35,7 @@ namespace Recyclable.Collections.Benchmarks { var data = TestObjects; var dataCount = TestObjectCount; - using var list = new RecyclableArrayList(dataCount); + using var list = new RecyclableArrayList(checked((int)dataCount)); for (var i = 0; i < dataCount; i++) { list.Add(data[i]); @@ -87,7 +87,7 @@ namespace Recyclable.Collections.Benchmarks { var data = TestObjects; var dataCount = TestObjectCount; - using var list = new RecyclableArrayList(dataCount); + using var list = new RecyclableArrayList(checked((int)dataCount)); list.AddRange(data); } diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableList.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableList.cs index 2dc5e42..c750122 100644 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableList.cs +++ b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableList.cs @@ -176,7 +176,7 @@ namespace Recyclable.Collections.Benchmarks public void RecyclableList_GetItem_AsWhile() { var data = _testRecyclableList; - int dataCount = TestObjectCount; + long dataCount = TestObjectCount; if (dataCount == 0) { return; @@ -315,7 +315,7 @@ namespace Recyclable.Collections.Benchmarks public void RecyclableList_Remove_FirstItems() { var data = TestObjects; - using var list = new RecyclableList(data); + using var list = new RecyclableList(data, minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; for (var i = 0; i < dataCount; i++) { @@ -327,7 +327,7 @@ namespace Recyclable.Collections.Benchmarks public void RecyclableList_Remove_LastItems() { var data = TestObjects; - using var list = new RecyclableList(data); + using var list = new RecyclableList(data, minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--) { @@ -339,7 +339,7 @@ namespace Recyclable.Collections.Benchmarks public void RecyclableList_RemoveAt_FirstItems() { var data = TestObjects; - using var list = new RecyclableList(data); + using var list = new RecyclableList(data, minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; for (var i = 0; i < dataCount; i++) { @@ -351,7 +351,7 @@ namespace Recyclable.Collections.Benchmarks public void RecyclableList_RemoveAt_LastItems() { var data = TestObjects; - using var list = new RecyclableList(data); + using var list = new RecyclableList(data, minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--) { diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.cs index 4bce805..5a6e8f4 100644 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.cs +++ b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.cs @@ -16,9 +16,9 @@ namespace Recyclable.Collections.Benchmarks public void Setup() { Console.WriteLine("******* GLOBAL SETUP RAISED *******"); - _testObjects = Enumerable.Range(1, TestObjectCount).Select(x => new object()).ToArray(); - _testRecyclableArrayList = new(TestObjects, initialCapacity: TestObjectCount); - _testRecyclableList = new(TestObjects, BlockSize, expectedItemsCount: TestObjectCount); + _testObjects = EnumerateTestObjects().ToArray(); + _testRecyclableArrayList = new(TestObjects, initialCapacity: checked((int)TestObjectCount)); + _testRecyclableList = new(TestObjects, BlockSize, expectedItemsCount: checked((int)TestObjectCount)); _testArray = TestObjects.ToArray(); _testObjectsAsList = TestObjects.ToList(); _testObjectsAsRecyclableArrayList = TestObjects.ToRecyclableArrayList(); @@ -26,6 +26,14 @@ namespace Recyclable.Collections.Benchmarks _testPooledList = new PooledList(TestObjects); } + private IEnumerable EnumerateTestObjects() + { + for (long i = 0; i < TestObjectCount; i++) + { + yield return new object(); + } + } + [GlobalCleanup] public void Cleanup() {