Benchmarks added & reorganized.

This commit is contained in:
mlemanczyk committed 2023-12-28 19:47:02 +01:00
1 parent ccf5c61dd0
commit a216c028a0
48 files changed
+13483 -363

No files matched your search

+62
View File
@@ -0,0 +1,62 @@
using Collections.Pooled;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_Add()
{
var data = TestObjects;
var dataCount = TestObjectCount;
var list = new int[dataCount];
for (var i = 0; i < dataCount; i++)
{
list[i] = data[i];
}
}
public void List_Add()
{
var data = TestObjects;
var dataCount = TestObjectCount;
var list = new List<int>();
for (var i = 0; i < dataCount; i++)
{
list.Add(data[i]);
}
}
public void PooledList_Add()
{
var data = TestObjects;
var dataCount = TestObjectCount;
using var list = new PooledList<int>(ClearMode.Auto);
for (var i = 0; i < dataCount; i++)
{
list.Add(data[i]);
}
}
public void RecyclableList_Add()
{
var data = TestObjects;
var dataCount = TestObjectCount;
using var list = new RecyclableList<int>();
for (var i = 0; i < dataCount; i++)
{
list.Add(data[i]);
}
}
public void RecyclableLongList_Add()
{
var data = TestObjects;
var dataCount = TestObjectCount;
using var list = new RecyclableLongList<int>();
for (var i = 0; i < dataCount; i++)
{
list.Add(data[i]);
}
}
}
}
+42
View File
@@ -0,0 +1,42 @@
using Collections.Pooled;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_AddRangeWhenSourceIsArray()
{
var data = TestObjects;
var list = new int[TestObjectCount];
data.CopyTo(list, 0);
}
public void List_AddRangeWhenSourceIsArray()
{
var data = TestObjects;
var list = new List<int>();
list.AddRange(data);
}
public void PooledList_AddRangeWhenSourceIsArray()
{
var data = TestObjects;
using var list = new PooledList<int>(ClearMode.Auto);
list.AddRange(data);
}
public void RecyclableList_AddRangeWhenSourceIsArray()
{
var data = TestObjects;
using var list = new RecyclableList<int>();
list.AddRange(data);
}
public void RecyclableLongList_AddRangeWhenSourceIsArray()
{
var data = TestObjects;
using var list = new RecyclableLongList<int>(minBlockSize: BlockSize);
list.AddRange(data);
}
}
}
@@ -0,0 +1,47 @@
using Collections.Pooled;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_AddRangeWhenSourceIsIEnumerable()
{
var data = TestObjectsAsIEnumerable;
var list = new int[TestObjectCount];
int itemIndex = 0;
foreach (var item in data)
{
list[itemIndex++] = item;
}
}
public void List_AddRangeWhenSourceIsIEnumerable()
{
var data = TestObjectsAsIEnumerable;
var list = new List<int>();
list.AddRange(data);
}
public void PooledList_AddRangeWhenSourceIsIEnumerable()
{
var data = TestObjectsAsIEnumerable;
using var list = new PooledList<int>(ClearMode.Auto);
list.AddRange(data);
}
public void RecyclableList_AddRangeWhenSourceIsIEnumerable()
{
var data = TestObjectsAsIEnumerable;
using var list = new RecyclableList<int>();
list.AddRange(data);
}
public void RecyclableLongList_AddRangeWhenSourceIsIEnumerable()
{
var data = TestObjectsAsIEnumerable;
using var list = new RecyclableLongList<int>(minBlockSize: BlockSize);
list.AddRange(data);
}
}
}
+42
View File
@@ -0,0 +1,42 @@
using Collections.Pooled;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_AddRangeWhenSourceIsIList()
{
var data = (IList<int>)TestObjectsAsRecyclableLongList;
var list = new int[TestObjectCount];
data.CopyTo(list, 0);
}
public void List_AddRangeWhenSourceIsIList()
{
var data = (IList<int>)TestObjectsAsRecyclableLongList;
var list = new List<int>();
list.AddRange(data);
}
public void PooledList_AddRangeWhenSourceIsIList()
{
var data = (IList<int>)TestObjectsAsRecyclableLongList;
using var list = new PooledList<int>(ClearMode.Auto);
list.AddRange(data);
}
public void RecyclableList_AddRangeWhenSourceIsIList()
{
var data = (IList<int>)TestObjectsAsRecyclableLongList;
using var list = new RecyclableList<int>();
list.AddRange(data);
}
public void RecyclableLongList_AddRangeWhenSourceIsIList()
{
var data = (IList<int>)TestObjectsAsRecyclableLongList;
using var list = new RecyclableLongList<int>(minBlockSize: BlockSize);
list.AddRange(data);
}
}
}
+42
View File
@@ -0,0 +1,42 @@
using Collections.Pooled;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_AddRangeWhenSourceIsList()
{
var data = TestObjectsAsList;
var list = new int[TestObjectCount];
data.CopyTo(list, 0);
}
public void List_AddRangeWhenSourceIsList()
{
var data = TestObjectsAsList;
var list = new List<int>();
list.AddRange(data);
}
public void PooledList_AddRangeWhenSourceIsList()
{
var data = TestObjectsAsList;
using var list = new PooledList<int>(ClearMode.Auto);
list.AddRange(data);
}
public void RecyclableList_AddRangeWhenSourceIsList()
{
var data = TestObjectsAsList;
using var list = new RecyclableList<int>();
list.AddRange(data);
}
public void RecyclableLongList_AddRangeWhenSourceIsList()
{
var data = TestObjectsAsList;
using var list = new RecyclableLongList<int>(minBlockSize: BlockSize);
list.AddRange(data);
}
}
}
@@ -0,0 +1,28 @@
using Collections.Pooled;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void PooledList_AddRangeWhenSourceIsPooledList()
{
var data = TestObjectsAsPooledList;
using var list = new PooledList<int>(capacity: TestObjectCount, ClearMode.Auto);
list.AddRange(data);
}
public void RecyclableList_AddRangeWhenSourceIsRecyclableList()
{
var data = TestObjectsAsRecyclableList;
using var list = new RecyclableList<int>(TestObjectCount);
list.AddRange(data);
}
public void RecyclableLongList_AddRangeWhenSourceIsRecyclableLongList()
{
var data = TestObjectsAsRecyclableList;
using var list = new RecyclableLongList<int>(minBlockSize: BlockSize, initialCapacity: TestObjectCount);
list.AddRange(data);
}
}
}
+47
View File
@@ -0,0 +1,47 @@
using Collections.Pooled;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_AddRange_WithCapacity()
{
var data = TestObjects;
var dataCount = TestObjectCount;
var list = new int[dataCount];
data.CopyTo(list, 0);
}
public void List_AddRange_WithCapacity()
{
var data = TestObjects;
var dataCount = TestObjectCount;
var list = new List<int>(dataCount);
list.AddRange(data);
}
public void PooledList_AddRange_WithCapacity()
{
var data = TestObjects;
var dataCount = TestObjectCount;
using var list = new PooledList<int>(capacity: dataCount, ClearMode.Auto);
list.AddRange(data);
}
public void RecyclableList_AddRange_WithCapacity()
{
var data = TestObjects;
var dataCount = TestObjectCount;
using var list = new RecyclableList<int>(dataCount);
list.AddRange(data);
}
public void RecyclableLongList_AddRange_WithCapacity()
{
var data = TestObjects;
var dataCount = TestObjectCount;
using var list = new RecyclableLongList<int>(minBlockSize: BlockSize, initialCapacity: dataCount);
list.AddRange(data);
}
}
}
+51
View File
@@ -0,0 +1,51 @@
using Collections.Pooled;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void List_Add_WithCapacity()
{
var data = TestObjects;
var dataCount = TestObjectCount;
var list = new List<int>(dataCount);
for (var i = 0; i < dataCount; i++)
{
list.Add(data[i]);
}
}
public void PooledList_Add_WithCapacity()
{
var data = TestObjects;
var dataCount = TestObjectCount;
using var list = new PooledList<int>(capacity: dataCount, ClearMode.Auto);
for (var i = 0; i < dataCount; i++)
{
list.Add(data[i]);
}
}
public void RecyclableList_Add_WithCapacity()
{
var data = TestObjects;
var dataCount = TestObjectCount;
using var list = new RecyclableList<int>(dataCount);
for (var i = 0; i < dataCount; i++)
{
list.Add(data[i]);
}
}
public void RecyclableLongList_Add_WithCapacity()
{
var data = TestObjects;
var dataCount = TestObjectCount;
using var list = new RecyclableLongList<int>(minBlockSize: BlockSize, initialCapacity: dataCount);
for (var i = 0; i < dataCount; i++)
{
list.Add(data[i]);
}
}
}
}
+62
View File
@@ -0,0 +1,62 @@
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
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.With(Array.IndexOf(list, data[i]) >= 0);
}
}
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.With(list.Contains(data[i]));
}
}
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.With(list.Contains(data[i]));
}
}
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.With(list.Contains(data[i]));
}
}
public void RecyclableLongList_Contains_FirstItems()
{
var data = TestObjects;
var list = TestObjectsAsRecyclableLongList;
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.Contains(data[i]));
}
}
}
}
+62
View File
@@ -0,0 +1,62 @@
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
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.With(list.Contains(data[^(i + 1)]));
}
}
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.With(list.Contains(data[^(i + 1)]));
}
}
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.With(list.Contains(data[^(i + 1)]));
}
}
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.With(list.Contains(data[^(i + 1)]));
}
}
public void RecyclableLongList_Contains_LastItems()
{
var data = TestObjects;
var list = TestObjectsAsRecyclableLongList;
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.Contains(data[^(i + 1)]));
}
}
}
}
+37
View File
@@ -0,0 +1,37 @@
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_Count()
{
var data = TestObjects;
DoNothing.With(data.Length);
}
public void List_Count()
{
var data = TestObjectsAsList;
DoNothing.With(data.Count);
}
public void PooledList_Count()
{
var data = TestObjectsAsPooledList;
DoNothing.With(data.Count);
}
public void RecyclableList_Count()
{
var data = TestObjectsAsRecyclableList;
DoNothing.With(data.Count);
}
public void RecyclableLongList_Count()
{
var data = TestObjectsAsRecyclableLongList;
DoNothing.With(data.Count);
}
}
}
+40
View File
@@ -0,0 +1,40 @@
using Collections.Pooled;
using Collections.Benchmarks.Core;
#pragma warning disable CA1822, CA1825
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_Create()
{
var list = new int[0];
DoNothing.With(list);
}
public void List_Create()
{
var list = new List<int>();
DoNothing.With(list);
}
public void PooledList_Create()
{
using var list = new PooledList<int>(ClearMode.Auto);
DoNothing.With(list);
}
public void RecyclableList_Create()
{
using var list = new RecyclableList<int>();
DoNothing.With(list);
}
public void RecyclableLongList_Create()
{
using var list = new RecyclableLongList<int>();
DoNothing.With(list);
}
}
}
+38
View File
@@ -0,0 +1,38 @@
using Collections.Pooled;
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_Create_WithCapacity()
{
var data = new int[TestObjectCount];
DoNothing.With(data);
}
public void List_Create_WithCapacity()
{
var list = new List<int>(TestObjectCount);
DoNothing.With(list);
}
public void PooledList_Create_WithCapacity()
{
using var list = new PooledList<int>(capacity: TestObjectCount, ClearMode.Auto);
DoNothing.With(list);
}
public void RecyclableList_Create_WithCapacity()
{
using var list = new RecyclableList<int>(TestObjectCount);
DoNothing.With(list);
}
public void RecyclableLongList_Create_WithCapacity()
{
using var list = new RecyclableLongList<int>(minBlockSize: BlockSize, initialCapacity: TestObjectCount);
DoNothing.With(list);
}
}
}
+87
View File
@@ -0,0 +1,87 @@
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_ForEach()
{
foreach (var item in TestObjects)
{
DoNothing.With(item);
}
}
public void Array_VersionedForEach()
{
foreach (var item in TestObjects)
{
DoNothing.With(item);
}
}
public void List_ForEach()
{
foreach (var item in TestObjectsAsList)
{
DoNothing.With(item);
}
}
public void List_VersionedForEach()
{
foreach (var item in TestObjectsAsList)
{
DoNothing.With(item);
}
}
public void PooledList_ForEach()
{
foreach (var item in TestObjectsAsPooledList)
{
DoNothing.With(item);
}
}
public void PooledList_VersionedForEach()
{
foreach (var item in TestObjectsAsPooledList)
{
DoNothing.With(item);
}
}
public void RecyclableList_ForEach()
{
foreach (var item in TestObjectsAsRecyclableList)
{
DoNothing.With(item);
}
}
public void RecyclableList_VersionedForEach()
{
foreach (var item in (IRecyclableVersionedList<int>)TestObjectsAsRecyclableList)
{
DoNothing.With(item);
}
}
public void RecyclableLongList_ForEach()
{
foreach (var item in TestObjectsAsRecyclableLongList)
{
DoNothing.With(item);
}
}
public void RecyclableLongList_VersionedForEach()
{
foreach (var item in (IRecyclableVersionedLongList<int>)TestObjectsAsRecyclableLongList)
{
DoNothing.With(item);
}
}
}
}
+160
View File
@@ -0,0 +1,160 @@
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_GetItem()
{
var data = TestObjects;
var dataCount = TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(data[i]);
}
}
public void List_GetItem()
{
var data = TestObjectsAsList;
var dataCount = TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(data[i]);
}
}
public void PooledList_GetItem()
{
var data = TestObjectsAsPooledList;
var dataCount = TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(data[i]);
}
}
public void RecyclableList_GetItem()
{
var data = TestObjectsAsRecyclableList;
var dataCount = TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(data[i]);
}
}
public void RecyclableLongList_GetItem()
{
var data = TestObjectsAsRecyclableLongList;
var dataCount = TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(data[i]);
}
}
public void RecyclableLongList_GetItem_AsSpan()
{
var data = TestObjectsAsRecyclableLongList;
int blockSize = data.BlockSize;
int nextItemBlockIndex = data.NextItemBlockIndex;
var memoryBlocks = new Span<int[]>(data.AsArray, 0, data.LastBlockWithData + 1);
for (var blockIndex = 0; blockIndex < nextItemBlockIndex; blockIndex++)
{
var memoryBlock = new Span<int>(memoryBlocks[blockIndex], 0, blockSize);
for (var itemIndex = 0; itemIndex < blockSize; itemIndex++)
{
DoNothing.With(memoryBlock[itemIndex]);
}
}
if (nextItemBlockIndex == data.LastBlockWithData)
{
var memoryBlock = new Span<int>(memoryBlocks[nextItemBlockIndex], 0, data.NextItemIndex);
for (var itemIndex = 0; itemIndex < memoryBlock.Length; itemIndex++)
{
DoNothing.With(memoryBlock[itemIndex]);
}
}
}
public void RecyclableLongList_GetItem_AsArray()
{
var data = TestObjectsAsRecyclableLongList;
int blockSize = data.BlockSize;
int nextItemBlockIndex = data.NextItemBlockIndex;
var memoryBlocks = data.AsArray;
for (var blockIndex = 0; blockIndex < nextItemBlockIndex; blockIndex++)
{
var memoryBlock = memoryBlocks[blockIndex];
for (var itemIndex = 0; itemIndex < blockSize; itemIndex++)
{
DoNothing.With(memoryBlock[itemIndex]);
}
}
if (nextItemBlockIndex == data.LastBlockWithData)
{
var memoryBlock = memoryBlocks[nextItemBlockIndex];
blockSize = data.NextItemIndex;
for (var itemIndex = 0; itemIndex < blockSize; itemIndex++)
{
DoNothing.With(memoryBlock[itemIndex]);
}
}
}
public void RecyclableLongList_GetItem_AsForEach()
{
var data = TestObjectsAsRecyclableLongList;
foreach (var item in data)
{
DoNothing.With(item);
}
}
public void RecyclableLongList_GetItem_AsWhile()
{
var data = TestObjectsAsRecyclableLongList;
int dataCount = TestObjectCount;
if (dataCount == 0)
{
return;
}
int blockSize = data.BlockSize;
int nextItemBlockIndex = data.NextItemBlockIndex;
int itemIndex = 0;
int blockIndex = 0;
var memoryBlocks = data.AsArray;
var memoryBlock = memoryBlocks[0];
while (blockIndex < nextItemBlockIndex)
{
DoNothing.With(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.With(memoryBlock[itemIndex++]);
}
}
}
}
}
+79
View File
@@ -0,0 +1,79 @@
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_IndexOf_BestAndWorstCases()
{
var data = TestObjects;
var list = TestObjects;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(Array.IndexOf(list, data[i]));
DoNothing.With(Array.IndexOf(list, data[^(i + 1)]));
}
}
public void List_IndexOf_BestAndWorstCases()
{
var data = TestObjects;
var list = TestObjectsAsList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.IndexOf(data[i]));
DoNothing.With(list.IndexOf(data[^(i + 1)]));
}
}
public void PooledList_IndexOf_BestAndWorstCases()
{
var data = TestObjects;
var list = TestObjectsAsPooledList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.IndexOf(data[i]));
DoNothing.With(list.IndexOf(data[^(i + 1)]));
}
}
public void RecyclableList_IndexOf_BestAndWorstCases()
{
var data = TestObjects;
var list = TestObjectsAsRecyclableList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.IndexOf(data[i]));
DoNothing.With(list.IndexOf(data[^(i + 1)]));
}
}
public void RecyclableLongList_IndexOf_BestAndWorstCases()
{
var data = TestObjects;
var list = TestObjectsAsRecyclableLongList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.IndexOf(data[i]));
DoNothing.With(list.IndexOf(data[^(i + 1)]));
}
}
public void RecyclableLongList_LongIndexOf_BestAndWorstCases()
{
var data = TestObjects;
var list = TestObjectsAsRecyclableLongList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.IndexOf(data[i]));
DoNothing.With(list.LongIndexOf(data[^(i + 1)]));
}
}
}
}
+73
View File
@@ -0,0 +1,73 @@
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_IndexOf_FirstItems()
{
var data = TestObjects;
var list = TestObjects;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(Array.IndexOf(list, data[i]));
}
}
public void List_IndexOf_FirstItems()
{
var data = TestObjects;
var list = TestObjectsAsList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.IndexOf(data[i]));
}
}
public void PooledList_IndexOf_FirstItems()
{
var data = TestObjects;
var list = TestObjectsAsPooledList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.IndexOf(data[i]));
}
}
public void RecyclableList_IndexOf_FirstItems()
{
var data = TestObjects;
var list = TestObjectsAsRecyclableList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.IndexOf(data[i]));
}
}
public void RecyclableLongList_IndexOf_FirstItems()
{
var data = TestObjects;
var list = TestObjectsAsRecyclableLongList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.IndexOf(data[i]));
}
}
public void RecyclableLongList_LongIndexOf_FirstItems()
{
var data = TestObjects;
var list = TestObjectsAsRecyclableLongList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.LongIndexOf(data[i]));
}
}
}
}
+73
View File
@@ -0,0 +1,73 @@
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_IndexOf_LastItems()
{
var data = TestObjects;
var list = TestObjects;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(Array.IndexOf(list, data[^(i + 1)]));
}
}
public void List_IndexOf_LastItems()
{
var data = TestObjects;
var list = TestObjectsAsList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.IndexOf(data[^(i + 1)]));
}
}
public void PooledList_IndexOf_LastItems()
{
var data = TestObjects;
var list = TestObjectsAsPooledList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.IndexOf(data[^(i + 1)]));
}
}
public void RecyclableList_IndexOf_LastItems()
{
var data = TestObjects;
var list = TestObjectsAsRecyclableList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.IndexOf(data[^(i + 1)]));
}
}
public void RecyclableLongList_IndexOf_LastItems()
{
var data = TestObjects;
var list = TestObjectsAsRecyclableLongList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.IndexOf(data[^(i + 1)]));
}
}
public void RecyclableLongList_LongIndexOf_LastItems()
{
var data = TestObjects;
var list = TestObjectsAsRecyclableLongList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.LongIndexOf(data[^(i + 1)]));
}
}
}
}
+19
View File
@@ -0,0 +1,19 @@
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_LongCount()
{
var data = TestObjects;
DoNothing.With(data.LongLength);
}
public void RecyclableLongList_LongCount()
{
var data = TestObjectsAsRecyclableLongList;
DoNothing.With(data.LongCount);
}
}
}
@@ -0,0 +1,117 @@
using BenchmarkDotNet.Attributes;
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks : DataDrivenBenchmarksBase<CollectionsBenchmarksSource>
{
protected override string GetTestMethodName(CollectionsBenchmarksSource benchmarkType) => TestCase switch
{
CollectionsBenchmarkType.AddRangeWhenSourceIsSameType => $"{benchmarkType}_AddRangeWhenSourceIs{benchmarkType}",
_ => $"{benchmarkType}_{TestCase}"
};
public RecyclableCollectionsBenchmarks()
{
TestObjectCount = 1;
//BaseDataType = RecyclableCollectionsBenchmarksSource.List;
DataType = CollectionsBenchmarksSource.RecyclableList;
}
// 0 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524_288
// 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912
// 1073741824 2147483648
// [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)]
// [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, 100_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, 850_000 - 1, 1_000_000, RecyclableDefaults.MaxPooledBlockSize)]
// [Params(1_000_000, 10_000_000, 100_000_000, 1_000_000_000)]
// [Params(1, 10, 64, 128, 192, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144)]
// [Params(524_288, 786_432, 1_048_576)]
// [Params(262_144, 393_216, 524_288)]
// [Params(850_000_000)]
// [Params(100_000_000)]
// [Params(RecyclableDefaults.MinItemsCountForParallelization)]
[Params(16_384)]
// [Params(127)]
// [Params(16)]
// [Params(10, 15, 128)]
// [Params(1)]
// [Params(RecyclableDefaults.MaxPooledBlockSize)]
// [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, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 10_000_000, 33_554_432, 50_000_000, 100_000_000)]
// *** [Params(RecyclableDefaults.MinPooledArrayLength - 3, RecyclableDefaults.MinPooledArrayLength - 2, RecyclableDefaults.MinPooledArrayLength - 1, RecyclableDefaults.MinPooledArrayLength, RecyclableDefaults.MinPooledArrayLength + 1, RecyclableDefaults.MinPooledArrayLength + 2, RecyclableDefaults.MinPooledArrayLength + 3)]
// *** [Params(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 32, 40, RecyclableDefaults.MinPooledArrayLength - 1, RecyclableDefaults.MinPooledArrayLength, 40, 50, 60, 70, 80, 90, 100, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, RecyclableDefaults.MinItemsCountForParallelization)]
// *** [Params(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 32, 40, RecyclableDefaults.MinPooledArrayLength - 1, RecyclableDefaults.MinPooledArrayLength, 40, 50, 60, 70, 80, 90, 100, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, RecyclableDefaults.MinItemsCountForParallelization)]
// [Params(256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, RecyclableDefaults.MinItemsCountForParallelization)]
// [Params(RecyclableDefaults.MinItemsCountForParallelization, 1_048_576, 2_097_152, 4_194_304, 8_388_608, 16_777_216, 33_554_432, RecyclableDefaults.MaxPooledBlockSize)]
// *** [Params(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, RecyclableDefaults.MinPooledArrayLength - 1, RecyclableDefaults.MinPooledArrayLength, 40, 50, 60, 64, 70, 80, 90, 100, 127, 128)]
// [Params(1, 10, 1024, 10240, RecyclableDefaults.MinPooledArrayLength, RecyclableDefaults.MinItemsCountForParallelization)]
// [Params(RecyclableDefaults.MinItemsCountForParallelization * 3)]
// [Params(1_048_576)]
public override int TestObjectCount { get => base.TestObjectCount; set => base.TestObjectCount = value; }
[Params
(
CollectionsBenchmarksSource.Array,
CollectionsBenchmarksSource.List,
CollectionsBenchmarksSource.PooledList,
CollectionsBenchmarksSource.RecyclableList,
CollectionsBenchmarksSource.RecyclableLongList
)]
public override CollectionsBenchmarksSource DataType { get => base.DataType; set => base.DataType = value; }
[Params
(
CollectionsBenchmarkType.Add_WithCapacity,
CollectionsBenchmarkType.Add,
CollectionsBenchmarkType.AddRange_WithCapacity,
CollectionsBenchmarkType.AddRangeWhenSourceIsArray,
CollectionsBenchmarkType.AddRangeWhenSourceIsIEnumerable,
CollectionsBenchmarkType.AddRangeWhenSourceIsIList,
CollectionsBenchmarkType.AddRangeWhenSourceIsList,
CollectionsBenchmarkType.AddRangeWhenSourceIsSameType,
CollectionsBenchmarkType.BinarySearch_BestAndWorstCases,
CollectionsBenchmarkType.Contains_FirstItems,
CollectionsBenchmarkType.Contains_LastItems,
CollectionsBenchmarkType.ConvertAll,
CollectionsBenchmarkType.Count,
CollectionsBenchmarkType.Create_WithCapacity,
CollectionsBenchmarkType.Create,
CollectionsBenchmarkType.Exists_BestAndWorstCases,
CollectionsBenchmarkType.Find_BestAndWorstCases,
CollectionsBenchmarkType.FindAll_BestAndWorstCases,
CollectionsBenchmarkType.FindLast_BestAndWorstCases,
CollectionsBenchmarkType.FindLastIndex_BestAndWorstCases,
CollectionsBenchmarkType.ForEach,
CollectionsBenchmarkType.GetItem,
CollectionsBenchmarkType.IndexOf_BestAndWorstCases,
CollectionsBenchmarkType.IndexOf_FirstItems,
CollectionsBenchmarkType.IndexOf_LastItems,
CollectionsBenchmarkType.LongCount,
CollectionsBenchmarkType.Remove_FirstItems,
CollectionsBenchmarkType.Remove_LastItems,
CollectionsBenchmarkType.RemoveAt_FirstItems,
CollectionsBenchmarkType.RemoveAt_LastItems,
CollectionsBenchmarkType.SetItem,
CollectionsBenchmarkType.VersionedForEach
)]
public virtual CollectionsBenchmarkType TestCase { get; set; }
public override void Setup()
{
base.Setup();
switch(TestCase)
{
case CollectionsBenchmarkType.AddRangeWhenSourceIsIList:
PrepareData(CollectionsBenchmarksSource.RecyclableLongList);
break;
case CollectionsBenchmarkType.AddRangeWhenSourceIsSameType:
PrepareData(CollectionsBenchmarksSource.RecyclableList);
break;
}
}
}
}
+51
View File
@@ -0,0 +1,51 @@
using Collections.Pooled;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void List_RemoveAt_FirstItems()
{
var data = TestObjects;
var list = new List<int>(data);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
list.RemoveAt(0);
}
}
public void PooledList_RemoveAt_FirstItems()
{
var data = TestObjects;
using var list = new PooledList<int>(data, ClearMode.Auto);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
list.RemoveAt(0);
}
}
public void RecyclableList_RemoveAt_FirstItems()
{
var data = TestObjects;
using var list = new RecyclableList<int>(data);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
list.RemoveAt(0);
}
}
public void RecyclableLongList_RemoveAt_FirstItems()
{
var data = TestObjects;
using var list = new RecyclableLongList<int>(data, minBlockSize: BlockSize, initialCapacity: base.TestObjectCount);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
list.RemoveAt(0);
}
}
}
}
+51
View File
@@ -0,0 +1,51 @@
using Collections.Pooled;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void List_RemoveAt_LastItems()
{
var data = TestObjects;
var list = new List<int>(data);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--)
{
list.RemoveAt(i);
}
}
public void PooledList_RemoveAt_LastItems()
{
var data = TestObjects;
using var list = new PooledList<int>(data, ClearMode.Auto);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--)
{
list.RemoveAt(i);
}
}
public void RecyclableList_RemoveAt_LastItems()
{
var data = TestObjects;
using var list = new RecyclableList<int>(data);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--)
{
list.RemoveAt(i);
}
}
public void RecyclableLongList_RemoveAt_LastItems()
{
var data = TestObjects;
using var list = new RecyclableLongList<int>(data, minBlockSize: BlockSize, initialCapacity: base.TestObjectCount);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--)
{
list.RemoveAt(i);
}
}
}
}
+52
View File
@@ -0,0 +1,52 @@
using Collections.Pooled;
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void List_Remove_FirstItems()
{
var data = TestObjects;
var list = new List<int>(data);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.Remove(data[i]));
}
}
public void PooledList_Remove_FirstItems()
{
var data = TestObjects;
using var list = new PooledList<int>(data, ClearMode.Auto);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.Remove(data[i]));
}
}
public void RecyclableList_Remove_FirstItems()
{
var data = TestObjects;
using var list = new RecyclableList<int>(data);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.Remove(data[i]));
}
}
public void RecyclableLongList_Remove_FirstItems()
{
var data = TestObjects;
using var list = new RecyclableLongList<int>(data, minBlockSize: BlockSize, initialCapacity: base.TestObjectCount);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.Remove(data[i]));
}
}
}
}
+52
View File
@@ -0,0 +1,52 @@
using Collections.Pooled;
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void List_Remove_LastItems()
{
var data = TestObjects;
var list = new List<int>(data);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--)
{
DoNothing.With(list.Remove(data[i]));
}
}
public void PooledList_Remove_LastItems()
{
var data = TestObjects;
using var list = new PooledList<int>(data, ClearMode.Auto);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--)
{
DoNothing.With(list.Remove(data[i]));
}
}
public void RecyclableList_Remove_LastItems()
{
var data = TestObjects;
using var list = new RecyclableList<int>(data);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--)
{
DoNothing.With(list.Remove(data[i]));
}
}
public void RecyclableLongList_Remove_LastItems()
{
var data = TestObjects;
using var list = new RecyclableLongList<int>(data, minBlockSize: BlockSize, initialCapacity:base.TestObjectCount);
var dataCount = TestObjectCount / 10 > 0 ? TestObjectCount / 10 : TestObjectCount;
for (var i = data.Length - 1; i > data.Length - dataCount - 1; i--)
{
DoNothing.With(list.Remove(data[i]));
}
}
}
}
+56
View File
@@ -0,0 +1,56 @@
namespace Recyclable.Collections.Benchmarks
{
public partial class RecyclableCollectionsBenchmarks
{
public void Array_SetItem()
{
var data = TestObjects;
var dataCount = TestObjectCount;
long index = 0;
for (var i = 0; i < dataCount; i++)
{
data[index] = TestObjects[index++];
}
}
public void List_SetItem()
{
var data = TestObjectsAsList;
var dataCount = TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
data[i] = TestObjects[i];
}
}
public void PooledList_SetItem()
{
var data = TestObjectsAsPooledList;
var dataCount = TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
data[i] = TestObjects[i];
}
}
public void RecyclableList_SetItem()
{
var data = TestObjectsAsRecyclableList;
var dataCount = TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
data[i] = TestObjects[i];
}
}
public void RecyclableLongList_SetItem()
{
var data = TestObjectsAsRecyclableLongList;
var dataCount = TestObjectCount;
for (var i = 0; i < dataCount; i++)
{
data[i] = TestObjects[i];
}
}
}
}