From 3cb0a47c601303d7cb636fc3decef874803a560e Mon Sep 17 00:00:00 2001 From: mlemanczyk Date: Wed, 12 Apr 2023 23:36:11 +0200 Subject: [PATCH] RecyclableCollectionsBenchmarks split into multiple files. --- .../Benchmarks/Add.cs | 56 +++ .../Benchmarks/AddRangeWhenSourceIsArray.cs | 40 ++ .../AddRangeWhenSourceIsIEnumerable.cs | 40 ++ .../Benchmarks/AddRangeWhenSourceIsIList.cs | 40 ++ .../Benchmarks/AddRangeWhenSourceIsList.cs | 40 ++ .../AddRangeWhenSourceIsSameType.cs | 32 ++ .../Benchmarks/AddRange_WithCapacity.cs | 44 +++ .../Benchmarks/Add_WithCapacity.cs | 56 +++ .../Benchmarks/Contains_FirstItems.cs | 67 ++++ .../Benchmarks/Contains_LastItems.cs | 68 ++++ .../Benchmarks/Count.cs | 43 +++ .../Benchmarks/Create.cs | 36 ++ .../Benchmarks/Create_WithCapacity.cs | 43 +++ .../Benchmarks/GetItem..cs | 174 +++++++++ .../Benchmarks/IndexOf_FirstItems.cs | 80 ++++ .../Benchmarks/IndexOf_LastItems.cs | 80 ++++ .../Benchmarks/LongCount.cs | 22 ++ .../RecyclableCollections.Benchmarks.cs} | 3 +- .../Benchmarks/RemoveAt_FirstItems.cs | 56 +++ .../Benchmarks/RemoveAt_LastItems.cs | 56 +++ .../Benchmarks/Remove_FirstItems.cs | 57 +++ .../Benchmarks/Remove_LastItems.cs | 57 +++ .../Benchmarks/SetItem.cs | 64 ++++ .../RecyclableCollectionsBenchmarks.Array.cs | 65 ---- .../RecyclableCollectionsBenchmarks.List.cs | 211 ---------- ...yclableCollectionsBenchmarks.PooledList.cs | 220 ----------- ...llectionsBenchmarks.RecyclableArrayList.cs | 183 --------- ...bleCollectionsBenchmarks.RecyclableList.cs | 362 ------------------ 28 files changed, 1253 insertions(+), 1042 deletions(-) create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/Add.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsArray.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsIEnumerable.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsIList.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsList.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsSameType.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/AddRange_WithCapacity.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/Add_WithCapacity.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/Contains_FirstItems.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/Contains_LastItems.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/Count.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/Create.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/Create_WithCapacity.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/GetItem..cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/IndexOf_FirstItems.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/IndexOf_LastItems.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/LongCount.cs rename Recyclable.Collections.Benchmarks/{RecyclableCollectionsBenchmarks.cs => Benchmarks/RecyclableCollections.Benchmarks.cs} (95%) create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/RemoveAt_FirstItems.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/RemoveAt_LastItems.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/Remove_FirstItems.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/Remove_LastItems.cs create mode 100644 Recyclable.Collections.Benchmarks/Benchmarks/SetItem.cs delete mode 100644 Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.Array.cs delete mode 100644 Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.List.cs delete mode 100644 Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.PooledList.cs delete mode 100644 Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableArrayList.cs delete mode 100644 Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableList.cs diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/Add.cs b/Recyclable.Collections.Benchmarks/Benchmarks/Add.cs new file mode 100644 index 0000000..ed6b624 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/Add.cs @@ -0,0 +1,56 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void List_Add() + { + var data = TestObjects; + var dataCount = TestObjectCount; + var list = new List(); + for (var i = 0; i < dataCount; i++) + { + list.Add(data[i]); + } + } + + //[Benchmark(Baseline = true)] + public void PooledList_Add() + { + var data = TestObjects; + var dataCount = TestObjectCount; + using var list = new PooledList(ClearMode.Always); + for (var i = 0; i < dataCount; i++) + { + list.Add(data[i]); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_Add() + { + var data = TestObjects; + var dataCount = TestObjectCount; + using var list = new RecyclableArrayList(); + for (var i = 0; i < dataCount; i++) + { + list.Add(data[i]); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_Add() + { + var data = TestObjects; + var dataCount = TestObjectCount; + using var list = new RecyclableList(); + for (var i = 0; i < dataCount; i++) + { + list.Add(data[i]); + } + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsArray.cs b/Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsArray.cs new file mode 100644 index 0000000..895ea47 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsArray.cs @@ -0,0 +1,40 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void List_AddRangeWhenSourceIsArray() + { + var data = TestObjects; + var list = new List(); + list.AddRange(data); + } + + //[Benchmark(Baseline = true)] + public void PooledList_AddRangeWhenSourceIsArray() + { + var data = TestObjects; + using var list = new PooledList(capacity: checked((int)TestObjectCount), ClearMode.Always); + list.AddRange(data); + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_AddRangeWhenSourceIsArray() + { + var data = TestObjects; + using var list = new RecyclableArrayList(); + list.AddRange(data); + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_AddRangeWhenSourceIsArray() + { + var data = TestObjects; + using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); + list.AddRange(data); + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsIEnumerable.cs b/Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsIEnumerable.cs new file mode 100644 index 0000000..8b1fc99 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsIEnumerable.cs @@ -0,0 +1,40 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void List_AddRangeWhenSourceIsIEnumerable() + { + var data = TestObjectsAsIEnumerable; + var list = new List(); + list.AddRange(data); + } + + //[Benchmark(Baseline = true)] + public void PooledList_AddRangeWhenSourceIsIEnumerable() + { + var data = TestObjectsAsIEnumerable; + using var list = new PooledList(capacity: checked((int)TestObjectCount), ClearMode.Always); + list.AddRange(data); + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_AddRangeWhenSourceIsIEnumerable() + { + var data = TestObjectsAsIEnumerable; + using var list = new RecyclableArrayList(); + list.AddRange(data); + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_AddRangeWhenSourceIsIEnumerable() + { + var data = TestObjectsAsIEnumerable; + using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); + list.AddRange(data); + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsIList.cs b/Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsIList.cs new file mode 100644 index 0000000..271f04d --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsIList.cs @@ -0,0 +1,40 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void List_AddRangeWhenSourceIsIList() + { + var data = (IList)TestObjectsAsRecyclableList; + var list = new List(); + list.AddRange(data); + } + + //[Benchmark(Baseline = true)] + public void PooledList_AddRangeWhenSourceIsIList() + { + var data = (IList)TestObjectsAsPooledList; + using var list = new PooledList(capacity: checked((int)TestObjectCount), ClearMode.Always); + list.AddRange(data); + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_AddRangeWhenSourceIsIList() + { + var data = (IList)TestObjectsAsRecyclableList; + using var list = new RecyclableArrayList(); + list.AddRange(data); + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_AddRangeWhenSourceIsIList() + { + var data = (IList)TestObjectsAsRecyclableList; + using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); + list.AddRange(data); + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsList.cs b/Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsList.cs new file mode 100644 index 0000000..12b34cf --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsList.cs @@ -0,0 +1,40 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void List_AddRangeWhenSourceIsList() + { + var data = TestObjectsAsList; + var list = new List(); + list.AddRange(data); + } + + //[Benchmark(Baseline = true)] + public void PooledList_AddRangeWhenSourceIsList() + { + var data = TestObjectsAsList; + using var list = new PooledList(capacity: checked((int)TestObjectCount), ClearMode.Always); + list.AddRange(data); + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_AddRangeWhenSourceIsList() + { + var data = TestObjectsAsList; + using var list = new RecyclableArrayList(); + list.AddRange(data); + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_AddRangeWhenSourceIsList() + { + var data = TestObjectsAsList; + using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); + list.AddRange(data); + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsSameType.cs b/Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsSameType.cs new file mode 100644 index 0000000..6fd6e49 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/AddRangeWhenSourceIsSameType.cs @@ -0,0 +1,32 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = true)] + public void PooledList_AddRangeWhenSourceIsPooledList() + { + var data = TestObjectsAsPooledList; + using var list = new PooledList(capacity: checked((int)TestObjectCount), ClearMode.Always); + list.AddRange(data); + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_AddRangeWhenSourceIsRecyclableArrayList() + { + var data = TestObjectsAsRecyclableArrayList; + using var list = new RecyclableArrayList(); + list.AddRange(data); + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_AddRangeWhenSourceIsRecyclableArrayList() + { + var data = TestObjectsAsRecyclableArrayList; + using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); + list.AddRange(data); + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/AddRange_WithCapacity.cs b/Recyclable.Collections.Benchmarks/Benchmarks/AddRange_WithCapacity.cs new file mode 100644 index 0000000..0d6bcc8 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/AddRange_WithCapacity.cs @@ -0,0 +1,44 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void List_AddRange_WithCapacity() + { + var data = TestObjects; + var dataCount = TestObjectCount; + var list = new List(checked((int)dataCount)); + list.AddRange(data); + } + + //[Benchmark(Baseline = true)] + public void PooledList_AddRange_WithCapacity() + { + var data = TestObjects; + var dataCount = TestObjectCount; + using var list = new PooledList(capacity: checked((int)TestObjectCount), ClearMode.Always); + list.AddRange(data); + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_AddRange_WithCapacity() + { + var data = TestObjects; + var dataCount = TestObjectCount; + using var list = new RecyclableArrayList(checked((int)dataCount)); + list.AddRange(data); + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_AddRange_WithCapacity() + { + var data = TestObjects; + var dataCount = TestObjectCount; + using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); + list.AddRange(data); + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/Add_WithCapacity.cs b/Recyclable.Collections.Benchmarks/Benchmarks/Add_WithCapacity.cs new file mode 100644 index 0000000..8ecfdaf --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/Add_WithCapacity.cs @@ -0,0 +1,56 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void List_Add_WithCapacity() + { + var data = TestObjects; + var dataCount = TestObjectCount; + var list = new List(checked((int)dataCount)); + for (var i = 0; i < dataCount; i++) + { + list.Add(data[i]); + } + } + + //[Benchmark(Baseline = true)] + public void PooledList_Add_WithCapacity() + { + var data = TestObjects; + var dataCount = TestObjectCount; + using var list = new PooledList(capacity: checked((int)dataCount), ClearMode.Always); + for (var i = 0; i < dataCount; i++) + { + list.Add(data[i]); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_Add_WithCapacity() + { + var data = TestObjects; + var dataCount = TestObjectCount; + using var list = new RecyclableArrayList(checked((int)dataCount)); + for (var i = 0; i < dataCount; i++) + { + list.Add(data[i]); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_Add_WithCapacity() + { + var data = TestObjects; + var dataCount = TestObjectCount; + using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: dataCount); + for (var i = 0; i < dataCount; i++) + { + list.Add(data[i]); + } + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/Contains_FirstItems.cs b/Recyclable.Collections.Benchmarks/Benchmarks/Contains_FirstItems.cs new file mode 100644 index 0000000..98e7362 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/Contains_FirstItems.cs @@ -0,0 +1,67 @@ +using BenchmarkDotNet.Attributes; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void Array_Contains_FirstItems() + { + var data = TestObjects; + var list = TestObjects; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(Array.IndexOf(list, data[i]) >= 0); + } + } + + //[Benchmark(Baseline = false)] + public void List_Contains_FirstItems() + { + var data = TestObjects; + var list = TestObjectsAsList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.Contains(data[i])); + } + } + + //[Benchmark(Baseline = true)] + public void PooledList_Contains_FirstItems() + { + var data = TestObjects; + var list = TestObjectsAsPooledList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.Contains(data[i])); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_Contains_FirstItems() + { + var data = TestObjects; + var list = TestObjectsAsRecyclableArrayList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.Contains(data[i])); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_Contains_FirstItems() + { + var data = TestObjects; + var list = TestObjectsAsRecyclableList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.Contains(data[i])); + } + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/Contains_LastItems.cs b/Recyclable.Collections.Benchmarks/Benchmarks/Contains_LastItems.cs new file mode 100644 index 0000000..dc9da22 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/Contains_LastItems.cs @@ -0,0 +1,68 @@ +using BenchmarkDotNet.Attributes; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void Array_Contains_LastItems() + { + var data = TestObjects; + var list = TestObjects; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.Contains(data[^(i + 1)])); + } + } + + //[Benchmark(Baseline = false)] + public void List_Contains_LastItems() + { + var data = TestObjects; + var list = TestObjectsAsList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.Contains(data[^(i + 1)])); + } + } + + //[Benchmark(Baseline = true)] + public void PooledList_Contains_LastItems() + { + var data = TestObjects; + var list = TestObjectsAsPooledList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.Contains(data[^(i + 1)])); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_Contains_LastItems() + { + var data = TestObjects; + var list = TestObjectsAsRecyclableArrayList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.Contains(data[^(i + 1)])); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_Contains_LastItems() + { + var data = TestObjects; + var list = TestObjectsAsRecyclableList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.Contains(data[^(i + 1)])); + } + } + + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/Count.cs b/Recyclable.Collections.Benchmarks/Benchmarks/Count.cs new file mode 100644 index 0000000..d5286c5 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/Count.cs @@ -0,0 +1,43 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void Array_Count() + { + var data = _testArray; + DoNothing(data.Length); + } + + //[Benchmark(Baseline = false)] + public void List_Count() + { + var data = TestObjectsAsList; + DoNothing(data.Count); + } + + //[Benchmark(Baseline = true)] + public void PooledList_Count() + { + var data = _testPooledList; + DoNothing(data.Count); + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_Count() + { + var data = TestObjectsAsRecyclableArrayList; + DoNothing(data.Count); + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_Count() + { + var data = _testRecyclableList; + DoNothing(data.Count); + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/Create.cs b/Recyclable.Collections.Benchmarks/Benchmarks/Create.cs new file mode 100644 index 0000000..d0f5a46 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/Create.cs @@ -0,0 +1,36 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void List_Create() + { + var list = new List(); + DoNothing(list); + } + + //[Benchmark(Baseline = true)] + public void PooledList_Create() + { + using var list = new PooledList(ClearMode.Always); + DoNothing(list); + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_Create() + { + using var list = new RecyclableArrayList(); + DoNothing(list); + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_Create() + { + using var list = new RecyclableList(); + DoNothing(list); + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/Create_WithCapacity.cs b/Recyclable.Collections.Benchmarks/Benchmarks/Create_WithCapacity.cs new file mode 100644 index 0000000..1317ae0 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/Create_WithCapacity.cs @@ -0,0 +1,43 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void Array_Create_WithCapacity() + { + var data = new object[TestObjectCount]; + DoNothing(data); + } + + //[Benchmark(Baseline = false)] + public void List_Create_WithCapacity() + { + var list = new List(checked((int)TestObjectCount)); + DoNothing(list); + } + + //[Benchmark(Baseline = true)] + public void PooledList_Create_WithCapacity() + { + using var list = new PooledList(capacity: checked((int)TestObjectCount), ClearMode.Always); + DoNothing(list); + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_Create_WithCapacity() + { + using var list = new RecyclableArrayList(checked((int)TestObjectCount)); + DoNothing(list); + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_Create_WithCapacity() + { + using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); + DoNothing(list); + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/GetItem..cs b/Recyclable.Collections.Benchmarks/Benchmarks/GetItem..cs new file mode 100644 index 0000000..8e9cae5 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/GetItem..cs @@ -0,0 +1,174 @@ +using BenchmarkDotNet.Attributes; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + [Benchmark(Baseline = false)] + public void Array_GetItem() + { + var data = TestObjects; + var dataCount = TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(data[i]); + } + } + + [Benchmark(Baseline = false)] + public void List_GetItem() + { + var data = TestObjectsAsList; + var dataCount = TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(data[i]); + } + } + + [Benchmark(Baseline = true)] + public void PooledList_GetItem() + { + var data = _testPooledList; + var dataCount = TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(data[i]); + } + } + + [Benchmark(Baseline = false)] + public void RecyclableArrayList_GetItem() + { + var data = TestObjectsAsRecyclableArrayList; + var dataCount = TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(data[i]); + } + } + + [Benchmark(Baseline = false)] + public void RecyclableList_GetItem() + { + var data = _testRecyclableList; + var dataCount = TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(data[i]); + } + } + + [Benchmark(Baseline = false)] + public void RecyclableList_GetItem_AsSpan() + { + var data = _testRecyclableList; + var dataCount = TestObjectCount; + int blockSize = data.BlockSize; + int nextItemBlockIndex = data.NextItemBlockIndex; + + var memoryBlocks = new Span(data.MemoryBlocks, 0, data.LastBlockWithData + 1); + for (var blockIndex = 0; blockIndex < nextItemBlockIndex; blockIndex++) + { + var memoryBlock = new Span(memoryBlocks[blockIndex], 0, blockSize); + for (var itemIndex = 0; itemIndex < blockSize; itemIndex++) + { + DoNothing(memoryBlock[itemIndex]); + } + } + + if (nextItemBlockIndex == data.LastBlockWithData) + { + + var memoryBlock = new Span(memoryBlocks[nextItemBlockIndex], 0, data.NextItemIndex); + for (var itemIndex = 0; itemIndex < memoryBlock.Length; itemIndex++) + { + DoNothing(memoryBlock[itemIndex]); + } + } + } + + [Benchmark(Baseline = false)] + public void RecyclableList_GetItem_AsArray() + { + var data = _testRecyclableList; + var dataCount = TestObjectCount; + int blockSize = data.BlockSize; + int nextItemBlockIndex = data.NextItemBlockIndex; + + var memoryBlocks = data.MemoryBlocks; + for (var blockIndex = 0; blockIndex < nextItemBlockIndex; blockIndex++) + { + var memoryBlock = memoryBlocks[blockIndex]; + for (var itemIndex = 0; itemIndex < blockSize; itemIndex++) + { + DoNothing(memoryBlock[itemIndex]); + } + } + + if (nextItemBlockIndex == data.LastBlockWithData) + { + var memoryBlock = memoryBlocks[nextItemBlockIndex]; + blockSize = data.NextItemIndex; + for (var itemIndex = 0; itemIndex < blockSize; itemIndex++) + { + DoNothing(memoryBlock[itemIndex]); + } + } + } + + [Benchmark(Baseline = false)] + public void RecyclableList_GetItem_AsForEach() + { + var data = _testRecyclableList; + var dataCount = TestObjectCount; + + foreach (var item in data) + { + DoNothing(item); + } + } + + [Benchmark(Baseline = false)] + public void RecyclableList_GetItem_AsWhile() + { + var data = _testRecyclableList; + long dataCount = TestObjectCount; + if (dataCount == 0) + { + return; + } + + int blockSize = data.BlockSize; + int nextItemBlockIndex = data.NextItemBlockIndex; + int itemIndex = 0; + int blockIndex = 0; + var memoryBlocks = data.MemoryBlocks; + var memoryBlock = memoryBlocks[0]; + while (blockIndex < nextItemBlockIndex) + { + DoNothing(memoryBlock[itemIndex]); + if (itemIndex + 1 < blockSize) + { + itemIndex++; + } + else + { + blockIndex++; + memoryBlock = memoryBlocks[blockIndex]; + itemIndex = 0; + } + } + + if (nextItemBlockIndex == data.LastBlockWithData) + { + memoryBlock = memoryBlocks[nextItemBlockIndex]; + blockSize = data.NextItemIndex; + while (itemIndex < blockSize) + { + DoNothing(memoryBlock[itemIndex++]); + } + } + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/IndexOf_FirstItems.cs b/Recyclable.Collections.Benchmarks/Benchmarks/IndexOf_FirstItems.cs new file mode 100644 index 0000000..412f4d6 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/IndexOf_FirstItems.cs @@ -0,0 +1,80 @@ +using BenchmarkDotNet.Attributes; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void Array_IndexOf_FirstItems() + { + var data = TestObjects; + var list = TestObjects; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(Array.IndexOf(list, data[i])); + } + } + + //[Benchmark(Baseline = false)] + public void List_IndexOf_FirstItems() + { + var data = TestObjects; + var list = TestObjectsAsList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.IndexOf(data[i])); + } + } + + //[Benchmark(Baseline = true)] + public void PooledList_IndexOf_FirstItems() + { + var data = TestObjects; + var list = TestObjectsAsPooledList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.IndexOf(data[i])); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_IndexOf_FirstItems() + { + var data = TestObjects; + var list = TestObjectsAsRecyclableArrayList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.IndexOf(data[i])); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_IndexOf_FirstItems() + { + var data = TestObjects; + var list = TestObjectsAsRecyclableList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.IndexOf(data[i])); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_LongIndexOf_FirstItems() + { + var data = TestObjects; + var list = TestObjectsAsRecyclableList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.LongIndexOf(data[i])); + } + } + + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/IndexOf_LastItems.cs b/Recyclable.Collections.Benchmarks/Benchmarks/IndexOf_LastItems.cs new file mode 100644 index 0000000..f12a329 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/IndexOf_LastItems.cs @@ -0,0 +1,80 @@ +using BenchmarkDotNet.Attributes; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void Array_IndexOf_LastItems() + { + var data = TestObjects; + var list = TestObjects; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(Array.IndexOf(list, data[^(i + 1)])); + } + } + + //[Benchmark(Baseline = false)] + public void List_IndexOf_LastItems() + { + var data = TestObjects; + var list = TestObjectsAsList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.IndexOf(data[^(i + 1)])); + } + } + + //[Benchmark(Baseline = true)] + public void PooledList_IndexOf_LastItems() + { + var data = TestObjects; + var list = TestObjectsAsPooledList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.IndexOf(data[^(i + 1)])); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_IndexOf_LastItems() + { + var data = TestObjects; + var list = TestObjectsAsRecyclableArrayList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.IndexOf(data[^(i + 1)])); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_IndexOf_LastItems() + { + var data = TestObjects; + var list = TestObjectsAsRecyclableList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.IndexOf(data[^(i + 1)])); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_LongIndexOf_LastItems() + { + var data = TestObjects; + var list = TestObjectsAsRecyclableList; + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.LongIndexOf(data[^(i + 1)])); + } + } + + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/LongCount.cs b/Recyclable.Collections.Benchmarks/Benchmarks/LongCount.cs new file mode 100644 index 0000000..f9a2813 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/LongCount.cs @@ -0,0 +1,22 @@ +using BenchmarkDotNet.Attributes; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void Array_LongCount() + { + var data = _testArray; + DoNothing(data.LongLength); + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_LongCount() + { + var data = _testRecyclableList; + DoNothing(data.LongCount); + } + + } +} diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.cs b/Recyclable.Collections.Benchmarks/Benchmarks/RecyclableCollections.Benchmarks.cs similarity index 95% rename from Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.cs rename to Recyclable.Collections.Benchmarks/Benchmarks/RecyclableCollections.Benchmarks.cs index 422fe09..2b2ca80 100644 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.cs +++ b/Recyclable.Collections.Benchmarks/Benchmarks/RecyclableCollections.Benchmarks.cs @@ -3,7 +3,8 @@ using Collections.Pooled; namespace Recyclable.Collections.Benchmarks { - public partial class RecyclableCollectionsBenchmarks + [MemoryDiagnoser] + public partial class RecyclableCollectionsBenchmarks : BenchmarkBase { private object[] _testArray; private RecyclableArrayList _testRecyclableArrayList; diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/RemoveAt_FirstItems.cs b/Recyclable.Collections.Benchmarks/Benchmarks/RemoveAt_FirstItems.cs new file mode 100644 index 0000000..e6fed8e --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/RemoveAt_FirstItems.cs @@ -0,0 +1,56 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void List_RemoveAt_FirstItems() + { + var data = TestObjects; + var list = new List(data); + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + list.RemoveAt(i); + } + } + + //[Benchmark(Baseline = true)] + public void PooledList_RemoveAt_FirstItems() + { + var data = TestObjects; + using var list = new PooledList(data, ClearMode.Always); + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + list.RemoveAt(i); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_RemoveAt_FirstItems() + { + var data = TestObjects; + using var list = new RecyclableArrayList(data); + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + list.RemoveAt(i); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_RemoveAt_FirstItems() + { + var data = TestObjects; + 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++) + { + list.RemoveAt(i); + } + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/RemoveAt_LastItems.cs b/Recyclable.Collections.Benchmarks/Benchmarks/RemoveAt_LastItems.cs new file mode 100644 index 0000000..01ca9be --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/RemoveAt_LastItems.cs @@ -0,0 +1,56 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void List_RemoveAt_LastItems() + { + var data = TestObjects; + var list = new List(data); + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--) + { + list.RemoveAt(i); + } + } + + //[Benchmark(Baseline = true)] + public void PooledList_RemoveAt_LastItems() + { + var data = TestObjects; + using var list = new PooledList(data, ClearMode.Always); + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--) + { + list.RemoveAt(i); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_RemoveAt_LastItems() + { + var data = TestObjects; + using var list = new RecyclableArrayList(data); + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--) + { + list.RemoveAt(i); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_RemoveAt_LastItems() + { + var data = TestObjects; + 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--) + { + list.RemoveAt(i); + } + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/Remove_FirstItems.cs b/Recyclable.Collections.Benchmarks/Benchmarks/Remove_FirstItems.cs new file mode 100644 index 0000000..a771bae --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/Remove_FirstItems.cs @@ -0,0 +1,57 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void List_Remove_FirstItems() + { + var data = TestObjects; + var list = new List(data); + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.Remove(data[i])); + } + } + + //[Benchmark(Baseline = true)] + public void PooledList_Remove_FirstItems() + { + var data = TestObjects; + using var list = new PooledList(data, ClearMode.Always); + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.Remove(data[i])); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_Remove_FirstItems() + { + var data = TestObjects; + using var list = new RecyclableArrayList(data); + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(list.Remove(data[i])); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_Remove_FirstItems() + { + var data = TestObjects; + 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++) + { + DoNothing(list.Remove(data[i])); + } + } + + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/Remove_LastItems.cs b/Recyclable.Collections.Benchmarks/Benchmarks/Remove_LastItems.cs new file mode 100644 index 0000000..2070bc5 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/Remove_LastItems.cs @@ -0,0 +1,57 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void List_Remove_LastItems() + { + var data = TestObjects; + var list = new List(data); + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--) + { + DoNothing(list.Remove(data[i])); + } + } + + //[Benchmark(Baseline = true)] + public void PooledList_Remove_LastItems() + { + var data = TestObjects; + using var list = new PooledList(data, ClearMode.Always); + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--) + { + DoNothing(list.Remove(data[i])); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_Remove_LastItems() + { + var data = TestObjects; + using var list = new RecyclableArrayList(data); + var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; + for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--) + { + DoNothing(list.Remove(data[i])); + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_Remove_LastItems() + { + var data = TestObjects; + 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--) + { + DoNothing(list.Remove(data[i])); + } + } + } +} diff --git a/Recyclable.Collections.Benchmarks/Benchmarks/SetItem.cs b/Recyclable.Collections.Benchmarks/Benchmarks/SetItem.cs new file mode 100644 index 0000000..54dc577 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/Benchmarks/SetItem.cs @@ -0,0 +1,64 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks + { + //[Benchmark(Baseline = false)] + public void Array_SetItem() + { + var data = TestObjects; + var dataCount = TestObjectCount; + long index = 0; + for (var i = 0; i < dataCount; i++) + { + data[index] = TestObjects[index++]; + } + } + + //[Benchmark(Baseline = false)] + public void List_SetItem() + { + var data = TestObjectsAsList; + var dataCount = TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + data[i] = TestObjects[i]; + } + } + + //[Benchmark(Baseline = true)] + public void PooledList_SetItem() + { + var data = _testPooledList; + var dataCount = TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + data[i] = TestObjects[i]; + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableArrayList_SetItem() + { + var data = TestObjectsAsRecyclableArrayList; + var dataCount = TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + data[i] = TestObjects[i]; + } + } + + //[Benchmark(Baseline = false)] + public void RecyclableList_SetItem() + { + var data = _testRecyclableList; + var dataCount = TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + data[i] = TestObjects[i]; + } + } + } +} diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.Array.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.Array.cs deleted file mode 100644 index 10da984..0000000 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.Array.cs +++ /dev/null @@ -1,65 +0,0 @@ -using BenchmarkDotNet.Attributes; -using MoreLinq.Extensions; - -namespace Recyclable.Collections.Benchmarks -{ - [MemoryDiagnoser] - public partial class RecyclableCollectionsBenchmarks : BenchmarkBase - { - [Benchmark(Baseline = false)] - public void Array_Create_WithCapacity() - { - var data = new object[TestObjectCount]; - DoNothing(data); - } - - [Benchmark(Baseline = false)] - public void Array_SetItem() - { - var data = TestObjects; - var dataCount = TestObjectCount; - long index = 0; - for(var i = 0; i < dataCount; i++) - { - data[index] = TestObjects[index++]; - } - } - - [Benchmark(Baseline = false)] - public void Array_GetItem() - { - var data = TestObjects; - var dataCount = TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(data[i]); - } - } - - [Benchmark(Baseline = false)] - public void Array_Count() - { - var data = _testArray; - DoNothing(data.Length); - } - - [Benchmark(Baseline = false)] - public void Array_LongCount() - { - var data = _testArray; - DoNothing(data.LongLength); - } - - [Benchmark(Baseline = false)] - public void Array_IndexOf_FirstItems() - { - var data = TestObjects; - var list = TestObjects; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(Array.IndexOf(list, data[i])); - } - } - } -} diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.List.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.List.cs deleted file mode 100644 index a0bafdc..0000000 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.List.cs +++ /dev/null @@ -1,211 +0,0 @@ -using BenchmarkDotNet.Attributes; - -namespace Recyclable.Collections.Benchmarks -{ - public partial class RecyclableCollectionsBenchmarks : BenchmarkBase - { - [Benchmark(Baseline = false)] - public void List_Create() - { - var list = new List(); - DoNothing(list); - } - - [Benchmark(Baseline = false)] - public void List_Create_WithCapacity() - { - var list = new List(checked((int)TestObjectCount)); - DoNothing(list); - } - - [Benchmark(Baseline = false)] - public void List_Add() - { - var data = TestObjects; - var dataCount = TestObjectCount; - var list = new List(); - for (var i = 0; i < dataCount; i++) - { - list.Add(data[i]); - } - } - - [Benchmark(Baseline = false)] - public void List_Add_WithCapacity() - { - var data = TestObjects; - var dataCount = TestObjectCount; - var list = new List(checked((int)dataCount)); - for (var i = 0; i < dataCount; i++) - { - list.Add(data[i]); - } - } - - [Benchmark(Baseline = false)] - public void List_AddRangeWhenSourceIsArray() - { - var data = TestObjects; - var list = new List(); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void List_AddRangeWhenSourceIsList() - { - var data = TestObjectsAsList; - var list = new List(); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void List_AddRangeWhenSourceIsIList() - { - var data = (IList)TestObjectsAsRecyclableList; - var list = new List(); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void List_AddRangeWhenSourceIsIEnumerable() - { - var data = TestObjectsAsIEnumerable; - var list = new List(); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void List_AddRange_WithCapacity() - { - var data = TestObjects; - var dataCount = TestObjectCount; - var list = new List(checked((int)dataCount)); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void List_SetItem() - { - var data = TestObjectsAsList; - var dataCount = TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - data[i] = TestObjects[i]; - } - } - - [Benchmark(Baseline = false)] - public void List_GetItem() - { - var data = TestObjectsAsList; - var dataCount = TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(data[i]); - } - } - - [Benchmark(Baseline = false)] - public void List_Count() - { - var data = TestObjectsAsList; - DoNothing(data.Count); - } - - [Benchmark(Baseline = false)] - public void List_Contains_FirstItems() - { - var data = TestObjects; - var list = TestObjectsAsList; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.Contains(data[i])); - } - } - - [Benchmark(Baseline = false)] - public void List_Contains_LastItems() - { - var data = TestObjects; - var list = TestObjectsAsList; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.Contains(data[^(i + 1)])); - } - } - - [Benchmark(Baseline = false)] - public void List_IndexOf_FirstItems() - { - var data = TestObjects; - var list = TestObjectsAsList; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.IndexOf(data[i])); - } - } - - [Benchmark(Baseline = false)] - public void List_IndexOf_LastItems() - { - var data = TestObjects; - var list = TestObjectsAsList; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.IndexOf(data[^(i + 1)])); - } - } - - [Benchmark(Baseline = false)] - public void List_RemoveAt_FirstItems() - { - var data = TestObjects; - var list = new List(data); - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - list.RemoveAt(i); - } - } - - [Benchmark(Baseline = false)] - public void List_RemoveAt_LastItems() - { - var data = TestObjects; - var list = new List(data); - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--) - { - list.RemoveAt(i); - } - } - - [Benchmark(Baseline = false)] - public void List_Remove_FirstItems() - { - var data = TestObjects; - var list = new List(data); - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.Remove(data[i])); - } - } - - [Benchmark(Baseline = false)] - public void List_Remove_LastItems() - { - var data = TestObjects; - var list = new List(data); - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--) - { - DoNothing(list.Remove(data[i])); - } - } - } -} diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.PooledList.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.PooledList.cs deleted file mode 100644 index f20abf9..0000000 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.PooledList.cs +++ /dev/null @@ -1,220 +0,0 @@ -using BenchmarkDotNet.Attributes; -using Collections.Pooled; - -namespace Recyclable.Collections.Benchmarks -{ - public partial class RecyclableCollectionsBenchmarks : BenchmarkBase - { - [Benchmark(Baseline = false)] - public void PooledList_Create() - { - using var list = new PooledList(ClearMode.Always); - DoNothing(list); - } - - [Benchmark(Baseline = false)] - public void PooledList_Create_WithCapacity() - { - using var list = new PooledList(capacity: checked((int)TestObjectCount), ClearMode.Always); - DoNothing(list); - } - - [Benchmark(Baseline = false)] - public void PooledList_Add() - { - var data = TestObjects; - var dataCount = TestObjectCount; - using var list = new PooledList(ClearMode.Always); - for (var i = 0; i < dataCount; i++) - { - list.Add(data[i]); - } - } - - [Benchmark(Baseline = false)] - public void PooledList_Add_WithCapacity() - { - var data = TestObjects; - var dataCount = TestObjectCount; - using var list = new PooledList(capacity: checked((int)dataCount), ClearMode.Always); - for (var i = 0; i < dataCount; i++) - { - list.Add(data[i]); - } - } - - [Benchmark(Baseline = false)] - public void PooledList_AddRangeWhenSourceIsArray() - { - var data = TestObjects; - using var list = new PooledList(capacity: checked((int)TestObjectCount), ClearMode.Always); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void PooledList_AddRangeWhenSourceIsList() - { - var data = TestObjectsAsList; - using var list = new PooledList(capacity: checked((int)TestObjectCount), ClearMode.Always); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void PooledList_AddRangeWhenSourceIsIList() - { - var data = (IList)TestObjectsAsPooledList; - using var list = new PooledList(capacity: checked((int)TestObjectCount), ClearMode.Always); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void PooledList_AddRangeWhenSourceIsIEnumerable() - { - var data = TestObjectsAsIEnumerable; - using var list = new PooledList(capacity: checked((int)TestObjectCount), ClearMode.Always); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void PooledList_AddRangeWhenSourceIsPooledList() - { - var data = TestObjectsAsPooledList; - using var list = new PooledList(capacity: checked((int)TestObjectCount), ClearMode.Always); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void PooledList_AddRange_WithCapacity() - { - var data = TestObjects; - var dataCount = TestObjectCount; - using var list = new PooledList(capacity: checked((int)TestObjectCount), ClearMode.Always); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void PooledList_GetItem() - { - var data = _testPooledList; - var dataCount = TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(data[i]); - } - } - - [Benchmark(Baseline = false)] - public void PooledList_SetItem() - { - var data = _testPooledList; - var dataCount = TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - data[i] = TestObjects[i]; - } - } - - [Benchmark(Baseline = false)] - public void PooledList_Count() - { - var data = _testPooledList; - DoNothing(data.Count); - } - - [Benchmark(Baseline = false)] - public void PooledList_Contains_FirstItems() - { - var data = TestObjects; - var list = TestObjectsAsPooledList; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.Contains(data[i])); - } - } - - [Benchmark(Baseline = false)] - public void PooledList_Contains_LastItems() - { - var data = TestObjects; - var list = TestObjectsAsPooledList; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.Contains(data[^(i + 1)])); - } - } - - [Benchmark(Baseline = false)] - public void PooledList_IndexOf_FirstItems() - { - var data = TestObjects; - var list = TestObjectsAsPooledList; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.IndexOf(data[i])); - } - } - - [Benchmark(Baseline = false)] - public void PooledList_IndexOf_LastItems() - { - var data = TestObjects; - var list = TestObjectsAsPooledList; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.IndexOf(data[^(i + 1)])); - } - } - - [Benchmark(Baseline = false)] - public void PooledList_Remove_FirstItems() - { - var data = TestObjects; - using var list = new PooledList(data, ClearMode.Always); - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.Remove(data[i])); - } - } - - [Benchmark(Baseline = false)] - public void PooledList_Remove_LastItems() - { - var data = TestObjects; - using var list = new PooledList(data, ClearMode.Always); - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--) - { - DoNothing(list.Remove(data[i])); - } - } - - [Benchmark(Baseline = false)] - public void PooledList_RemoveAt_FirstItems() - { - var data = TestObjects; - using var list = new PooledList(data, ClearMode.Always); - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - list.RemoveAt(i); - } - } - - [Benchmark(Baseline = false)] - public void PooledList_RemoveAt_LastItems() - { - var data = TestObjects; - using var list = new PooledList(data, ClearMode.Always); - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--) - { - list.RemoveAt(i); - } - } - } -} diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableArrayList.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableArrayList.cs deleted file mode 100644 index d561175..0000000 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableArrayList.cs +++ /dev/null @@ -1,183 +0,0 @@ -using BenchmarkDotNet.Attributes; - -namespace Recyclable.Collections.Benchmarks -{ - public partial class RecyclableCollectionsBenchmarks : BenchmarkBase - { - [Benchmark(Baseline = false)] - public void RecyclableArrayList_Create() - { - using var list = new RecyclableArrayList(); - DoNothing(list); - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_Create_WithCapacity() - { - using var list = new RecyclableArrayList(checked((int)TestObjectCount)); - DoNothing(list); - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_Add() - { - var data = TestObjects; - var dataCount = TestObjectCount; - using var list = new RecyclableArrayList(); - for (var i = 0; i < dataCount; i++) - { - list.Add(data[i]); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_Add_WithCapacity() - { - var data = TestObjects; - var dataCount = TestObjectCount; - using var list = new RecyclableArrayList(checked((int)dataCount)); - for (var i = 0; i < dataCount; i++) - { - list.Add(data[i]); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_AddRangeWhenSourceIsArray() - { - var data = TestObjects; - using var list = new RecyclableArrayList(); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_AddRangeWhenSourceIsList() - { - var data = TestObjectsAsList; - using var list = new RecyclableArrayList(); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_AddRangeWhenSourceIsIList() - { - var data = (IList)TestObjectsAsRecyclableList; - using var list = new RecyclableArrayList(); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_AddRangeWhenSourceIsIEnumerable() - { - var data = TestObjectsAsIEnumerable; - using var list = new RecyclableArrayList(); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_AddRangeWhenSourceIsRecyclableArrayList() - { - var data = TestObjectsAsRecyclableArrayList; - using var list = new RecyclableArrayList(); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_AddRange_WithCapacity() - { - var data = TestObjects; - var dataCount = TestObjectCount; - using var list = new RecyclableArrayList(checked((int)dataCount)); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_SetItem() - { - var data = TestObjectsAsRecyclableArrayList; - var dataCount = TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - data[i] = TestObjects[i]; - } - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_GetItem() - { - var data = TestObjectsAsRecyclableArrayList; - var dataCount = TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(data[i]); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_Count() - { - var data = TestObjectsAsRecyclableArrayList; - DoNothing(data.Count); - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_IndexOf_FirstItems() - { - var data = TestObjects; - var list = TestObjectsAsRecyclableArrayList; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.IndexOf(data[i])); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_Remove_FirstItems() - { - var data = TestObjects; - using var list = new RecyclableArrayList(data); - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.Remove(data[i])); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_Remove_LastItems() - { - var data = TestObjects; - using var list = new RecyclableArrayList(data); - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--) - { - DoNothing(list.Remove(data[i])); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_RemoveAt_FirstItems() - { - var data = TestObjects; - using var list = new RecyclableArrayList(data); - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - list.RemoveAt(i); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableArrayList_RemoveAt_LastItems() - { - var data = TestObjects; - using var list = new RecyclableArrayList(data); - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--) - { - list.RemoveAt(i); - } - } - } -} diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableList.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableList.cs deleted file mode 100644 index 71c4242..0000000 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.RecyclableList.cs +++ /dev/null @@ -1,362 +0,0 @@ -using BenchmarkDotNet.Attributes; - -namespace Recyclable.Collections.Benchmarks -{ - public partial class RecyclableCollectionsBenchmarks : BenchmarkBase - { - [Benchmark(Baseline = false)] - public void RecyclableList_Create() - { - using var list = new RecyclableList(); - DoNothing(list); - } - - [Benchmark(Baseline = false)] - public void RecyclableList_Create_WithCapacity() - { - using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); - DoNothing(list); - } - - [Benchmark(Baseline = false)] - public void RecyclableList_Add() - { - var data = TestObjects; - var dataCount = TestObjectCount; - using var list = new RecyclableList(); - for (var i = 0; i < dataCount; i++) - { - list.Add(data[i]); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_Add_WithCapacity() - { - var data = TestObjects; - var dataCount = TestObjectCount; - using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: dataCount); - for (var i = 0; i < dataCount; i++) - { - list.Add(data[i]); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_AddRangeWhenSourceIsArray() - { - var data = TestObjects; - using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void RecyclableList_AddRangeWhenSourceIsList() - { - var data = TestObjectsAsList; - using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void RecyclableList_AddRangeWhenSourceIsIList() - { - var data = (IList)TestObjectsAsRecyclableList; - using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void RecyclableList_AddRangeWhenSourceIsIEnumerable() - { - var data = TestObjectsAsIEnumerable; - using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void RecyclableList_AddRangeWhenSourceIsRecyclableArrayList() - { - var data = TestObjectsAsRecyclableArrayList; - using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void RecyclableList_AddRange_WithCapacity() - { - var data = TestObjects; - var dataCount = TestObjectCount; - using var list = new RecyclableList(minBlockSize: BlockSize, expectedItemsCount: TestObjectCount); - list.AddRange(data); - } - - [Benchmark(Baseline = false)] - public void RecyclableList_GetItem() - { - var data = _testRecyclableList; - var dataCount = TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(data[i]); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_GetItem_AsSpan() - { - var data = _testRecyclableList; - var dataCount = TestObjectCount; - int blockSize = data.BlockSize; - int nextItemBlockIndex = data.NextItemBlockIndex; - - var memoryBlocks = new Span(data.MemoryBlocks, 0, data.LastBlockWithData + 1); - for (var blockIndex = 0; blockIndex < nextItemBlockIndex; blockIndex++) - { - var memoryBlock = new Span(memoryBlocks[blockIndex], 0, blockSize); - for (var itemIndex = 0; itemIndex < blockSize; itemIndex++) - { - DoNothing(memoryBlock[itemIndex]); - } - } - - if (nextItemBlockIndex == data.LastBlockWithData) - { - - var memoryBlock = new Span(memoryBlocks[nextItemBlockIndex], 0, data.NextItemIndex); - for (var itemIndex = 0; itemIndex < memoryBlock.Length; itemIndex++) - { - DoNothing(memoryBlock[itemIndex]); - } - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_GetItem_AsArray() - { - var data = _testRecyclableList; - var dataCount = TestObjectCount; - int blockSize = data.BlockSize; - int nextItemBlockIndex = data.NextItemBlockIndex; - - var memoryBlocks = data.MemoryBlocks; - for (var blockIndex = 0; blockIndex < nextItemBlockIndex; blockIndex++) - { - var memoryBlock = memoryBlocks[blockIndex]; - for (var itemIndex = 0; itemIndex < blockSize; itemIndex++) - { - DoNothing(memoryBlock[itemIndex]); - } - } - - if (nextItemBlockIndex == data.LastBlockWithData) - { - var memoryBlock = memoryBlocks[nextItemBlockIndex]; - blockSize = data.NextItemIndex; - for (var itemIndex = 0; itemIndex < blockSize; itemIndex++) - { - DoNothing(memoryBlock[itemIndex]); - } - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_GetItem_AsForEach() - { - var data = _testRecyclableList; - var dataCount = TestObjectCount; - - foreach (var item in data) - { - DoNothing(item); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_GetItem_AsWhile() - { - var data = _testRecyclableList; - long dataCount = TestObjectCount; - if (dataCount == 0) - { - return; - } - - int blockSize = data.BlockSize; - int nextItemBlockIndex = data.NextItemBlockIndex; - int itemIndex = 0; - int blockIndex = 0; - var memoryBlocks = data.MemoryBlocks; - var memoryBlock = memoryBlocks[0]; - while (blockIndex < nextItemBlockIndex) - { - DoNothing(memoryBlock[itemIndex]); - if (itemIndex + 1 < blockSize) - { - itemIndex++; - } - else - { - blockIndex++; - memoryBlock = memoryBlocks[blockIndex]; - itemIndex = 0; - } - } - - if (nextItemBlockIndex == data.LastBlockWithData) - { - memoryBlock = memoryBlocks[nextItemBlockIndex]; - blockSize = data.NextItemIndex; - while (itemIndex < blockSize) - { - DoNothing(memoryBlock[itemIndex++]); - } - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_SetItem() - { - var data = _testRecyclableList; - var dataCount = TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - data[i] = TestObjects[i]; - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_Count() - { - var data = _testRecyclableList; - DoNothing(data.Count); - } - - [Benchmark(Baseline = false)] - public void RecyclableList_LongCount() - { - var data = _testRecyclableList; - DoNothing(data.LongCount); - } - - [Benchmark(Baseline = false)] - public void RecyclableList_Contains_FirstItems() - { - var data = TestObjects; - var list = TestObjectsAsRecyclableList; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.Contains(data[i])); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_Contains_LastItems() - { - var data = TestObjects; - var list = TestObjectsAsRecyclableList; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.Contains(data[^(i + 1)])); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_IndexOf_FirstItems() - { - var data = TestObjects; - var list = TestObjectsAsRecyclableList; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.IndexOf(data[i])); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_IndexOf_LastItems() - { - var data = TestObjects; - var list = TestObjectsAsRecyclableList; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.IndexOf(data[^(i + 1)])); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_LongIndexOf_FirstItems() - { - var data = TestObjects; - var list = TestObjectsAsRecyclableList; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.LongIndexOf(data[i])); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_LongIndexOf_LastItems() - { - var data = TestObjects; - var list = TestObjectsAsRecyclableList; - var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount; - for (var i = 0; i < dataCount; i++) - { - DoNothing(list.LongIndexOf(data[^(i + 1)])); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_Remove_FirstItems() - { - var data = TestObjects; - 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++) - { - DoNothing(list.Remove(data[i])); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_Remove_LastItems() - { - var data = TestObjects; - 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--) - { - DoNothing(list.Remove(data[i])); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_RemoveAt_FirstItems() - { - var data = TestObjects; - 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++) - { - list.RemoveAt(i); - } - } - - [Benchmark(Baseline = false)] - public void RecyclableList_RemoveAt_LastItems() - { - var data = TestObjects; - 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--) - { - list.RemoveAt(i); - } - } - } -}