From 07f1ee688037b60c26f89f14729a51e2c35f6e2d Mon Sep 17 00:00:00 2001 From: mlemanczyk Date: Thu, 30 Mar 2023 19:36:03 +0200 Subject: [PATCH] Benchmarks for Collections.Pooled added --- .../Recyclable.Collections.Benchmarks.csproj | 1 + ...yclableCollectionsBenchmarks.PooledList.cs | 172 ++++++++++++++++++ .../RecyclableCollectionsBenchmarks.cs | 6 + 3 files changed, 179 insertions(+) create mode 100644 Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.PooledList.cs diff --git a/Recyclable.Collections.Benchmarks/Recyclable.Collections.Benchmarks.csproj b/Recyclable.Collections.Benchmarks/Recyclable.Collections.Benchmarks.csproj index 190fbfc..ee77c13 100644 --- a/Recyclable.Collections.Benchmarks/Recyclable.Collections.Benchmarks.csproj +++ b/Recyclable.Collections.Benchmarks/Recyclable.Collections.Benchmarks.csproj @@ -10,6 +10,7 @@ + diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.PooledList.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.PooledList.cs new file mode 100644 index 0000000..f3e1c67 --- /dev/null +++ b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.PooledList.cs @@ -0,0 +1,172 @@ +using BenchmarkDotNet.Attributes; +using Collections.Pooled; + +namespace Recyclable.Collections.Benchmarks +{ + public partial class RecyclableCollectionsBenchmarks : BenchmarkBase + { + //[Benchmark] + public void PooledList_Create() + { + using var list = new PooledList(); + DoNothing(list); + } + + //[Benchmark] + public void PooledList_Create_WithCapacity() + { + using var list = new PooledList(capacity: TestObjectCount); + DoNothing(list); + } + + //[Benchmark] + public void PooledList_Add() + { + var data = TestObjects; + var dataCount = TestObjectCount; + using var list = new PooledList(); + for (var i = 0; i < dataCount; i++) + { + list.Add(data[i]); + } + } + + //[Benchmark] + public void PooledList_Add_WithCapacity() + { + var data = TestObjects; + var dataCount = TestObjectCount; + using var list = new PooledList(capacity: dataCount); + for (var i = 0; i < dataCount; i++) + { + list.Add(data[i]); + } + } + + //[Benchmark] + public void PooledList_AddRangeWhenSourceIsArray() + { + var data = TestObjects; + using var list = new PooledList(capacity: TestObjectCount); + list.AddRange(data); + } + + //[Benchmark] + public void PooledList_AddRangeWhenSourceIsList() + { + var data = TestObjectsAsList; + using var list = new PooledList(capacity: TestObjectCount); + list.AddRange(data); + } + + //[Benchmark] + public void PooledList_AddRangeWhenSourceIsIList() + { + var data = (IList)TestObjectsAsPooledList; + using var list = new PooledList(capacity: TestObjectCount); + list.AddRange(data); + } + + //[Benchmark] + public void PooledList_AddRangeWhenSourceIsIEnumerable() + { + var data = TestObjectsAsIEnumerable; + using var list = new PooledList(capacity: TestObjectCount); + list.AddRange(data); + } + + //[Benchmark] + public void PooledList_AddRangeWhenSourceIsPooledList() + { + var data = TestObjectsAsPooledList; + using var list = new PooledList(capacity: TestObjectCount); + list.AddRange(data); + } + + //[Benchmark] + public void PooledList_AddRange_WithCapacity() + { + var data = TestObjects; + var dataCount = TestObjectCount; + using var list = new PooledList(capacity: TestObjectCount); + list.AddRange(data); + } + + //[Benchmark] + public void PooledList_GetItem() + { + var data = _testPooledList; + var dataCount = TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + DoNothing(data[i]); + } + } + + //[Benchmark] + public void PooledList_SetItem() + { + var data = _testPooledList; + var dataCount = TestObjectCount; + for (var i = 0; i < dataCount; i++) + { + data[i] = TestObjects[i]; + } + } + + //[Benchmark] + public void PooledList_Count() + { + var data = _testPooledList; + DoNothing(data.Count); + } + + //[Benchmark] + 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] + 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] + 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] + 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)])); + } + } + } +} diff --git a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.cs b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.cs index 7c4e9de..4bce805 100644 --- a/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.cs +++ b/Recyclable.Collections.Benchmarks/RecyclableCollectionsBenchmarks.cs @@ -1,4 +1,5 @@ using BenchmarkDotNet.Attributes; +using Collections.Pooled; namespace Recyclable.Collections.Benchmarks { @@ -7,6 +8,9 @@ namespace Recyclable.Collections.Benchmarks private object[] _testArray; private RecyclableArrayList _testRecyclableArrayList; private RecyclableList _testRecyclableList; + private PooledList _testPooledList; + + public PooledList TestObjectsAsPooledList => _testPooledList ?? throw new NullReferenceException("Something is wrong and the field is not initialized"); [GlobalSetup] public void Setup() @@ -19,6 +23,7 @@ namespace Recyclable.Collections.Benchmarks _testObjectsAsList = TestObjects.ToList(); _testObjectsAsRecyclableArrayList = TestObjects.ToRecyclableArrayList(); _testObjectsAsRecyclableList = TestObjects.ToRecyclableList(); + _testPooledList = new PooledList(TestObjects); } [GlobalCleanup] @@ -27,6 +32,7 @@ namespace Recyclable.Collections.Benchmarks Console.WriteLine("******* GLOBAL CLEANUP *******"); _testRecyclableArrayList?.Dispose(); _testRecyclableList?.Dispose(); + _testPooledList?.Dispose(); TestObjectsAsRecyclableArrayList?.Dispose(); _testObjectsAsRecyclableArrayList = default; _testObjectsAsRecyclableList = default;