RecyclableLongList.BinarySearch implemented. Various performance improvements & fixes in RecyclableList.BinarySearch. Benchmarks & Tests extended.

This commit is contained in:
mlemanczyk committed 2023-11-01 20:27:59 +01:00
1 parent 393685f061
commit 1f7603fe08
15 files changed
+756 -172

No files matched your search

@@ -0,0 +1,39 @@
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Compatibility.List.Benchmarks
{
public class BinarySearchValueHigherThanFirstItemBenchmarks : RecyclableCollectionsCompatibilityListBenchmarks
{
public override string MethodNameSuffix => "_BinarySearch_ValueHigherThanFirstItem";
public void Array_BinarySearch_ValueHigherThanFirstItem()
{
var list = TestObjects;
DoNothing.With(Array.BinarySearch(list, int.MaxValue));
}
public void List_BinarySearch_ValueHigherThanFirstItem()
{
var list = TestObjectsAsList;
DoNothing.With(list.BinarySearch(int.MaxValue));
}
public void PooledList_BinarySearch_ValueHigherThanFirstItem()
{
var list = TestObjectsAsPooledList;
DoNothing.With(list.BinarySearch(int.MaxValue));
}
public void RecyclableList_BinarySearch_ValueHigherThanFirstItem()
{
var list = TestObjectsAsRecyclableList;
DoNothing.With(list.BinarySearch(int.MaxValue));
}
public void RecyclableLongList_BinarySearch_ValueHigherThanFirstItem()
{
var list = TestObjectsAsRecyclableLongList;
DoNothing.With(list.BinarySearch(int.MaxValue));
}
}
}
@@ -54,16 +54,16 @@ namespace Recyclable.Collections.Compatibility.List.Benchmarks
}
}
// public void RecyclableLongList_BinarySearch()
// {
// var data = TestObjects;
// var list = TestObjectsAsRecyclableLongList;
// var dataCount = TestObjectCountForSlowMethods;
// for (var i = 0; i < dataCount; i++)
// {
// DoNothing(list.BinarySearch(data[i]));
// DoNothing(list.BinarySearch(data[^(i + 1)]));
// }
// }
public void RecyclableLongList_BinarySearch()
{
var data = TestObjects;
var list = TestObjectsAsRecyclableLongList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.BinarySearch(data[i]));
DoNothing.With(list.BinarySearch(data[^(i + 1)]));
}
}
}
}
@@ -0,0 +1,70 @@
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Compatibility.List.Benchmarks
{
public class BinarySearchBenchmarksBestAndWorstCasesWhenConstrainedRange : RecyclableCollectionsCompatibilityListBenchmarks
{
public override string MethodNameSuffix => "_BinarySearchWhenConstrainedRange";
private readonly static Comparer<int> _comparer = Comparer<int>.Default;
public void Array_BinarySearchWhenConstrainedRange()
{
var data = TestObjects;
var list = TestObjects;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(Array.BinarySearch(list, 0, dataCount, data[i], _comparer));
DoNothing.With(Array.BinarySearch(list, 0, dataCount, data[^(i + 1)], _comparer));
}
}
public void List_BinarySearchWhenConstrainedRange()
{
var data = TestObjects;
var list = TestObjectsAsList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.BinarySearch(0, dataCount, data[i], _comparer));
DoNothing.With(list.BinarySearch(0, dataCount, data[^(i + 1)], _comparer));
}
}
public void PooledList_BinarySearchWhenConstrainedRange()
{
var data = TestObjects;
var list = TestObjectsAsPooledList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.BinarySearch(0, dataCount, data[i], _comparer));
DoNothing.With(list.BinarySearch(0, dataCount, data[^(i + 1)], _comparer));
}
}
public void RecyclableList_BinarySearchWhenConstrainedRange()
{
var data = TestObjects;
var list = TestObjectsAsRecyclableList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.BinarySearch(0, dataCount, data[i], _comparer));
DoNothing.With(list.BinarySearch(0, dataCount, data[^(i + 1)], _comparer));
}
}
public void RecyclableLongList_BinarySearchWhenConstrainedRange()
{
var data = TestObjects;
var list = TestObjectsAsRecyclableLongList;
var dataCount = TestObjectCountForSlowMethods;
for (var i = 0; i < dataCount; i++)
{
DoNothing.With(list.BinarySearch(0, dataCount, data[i], _comparer));
DoNothing.With(list.BinarySearch(0, dataCount, data[^(i + 1)], _comparer));
}
}
}
}
@@ -0,0 +1,39 @@
using Collections.Benchmarks.Core;
namespace Recyclable.Collections.Compatibility.List.Benchmarks
{
public class BinarySearchValueLowerThanFirstItemBenchmarks : RecyclableCollectionsCompatibilityListBenchmarks
{
public override string MethodNameSuffix => "_BinarySearch_ValueLowerThanFirstItem";
public void Array_BinarySearch_ValueLowerThanFirstItem()
{
var list = TestObjects;
DoNothing.With(Array.BinarySearch(list, -1));
}
public void List_BinarySearch_ValueLowerThanFirstItem()
{
var list = TestObjectsAsList;
DoNothing.With(list.BinarySearch(-1));
}
public void PooledList_BinarySearch_ValueLowerThanFirstItem()
{
var list = TestObjectsAsPooledList;
DoNothing.With(list.BinarySearch(-1));
}
public void RecyclableList_BinarySearch_ValueLowerThanFirstItem()
{
var list = TestObjectsAsRecyclableList;
DoNothing.With(list.BinarySearch(-1));
}
public void RecyclableLongList_BinarySearch_ValueLowerThanFirstItem()
{
var list = TestObjectsAsRecyclableLongList;
DoNothing.With(list.BinarySearch(-1));
}
}
}
@@ -12,13 +12,16 @@ namespace Recyclable.Collections.Compatibility.List.Benchmarks
{
BenchmarkRunner.Run(new[]
{
typeof(BinarySearchBenchmarks),
typeof(ConvertAllBenchmarks),
typeof(ExistsBenchmarks),
typeof(FindBenchmarks),
typeof(FindAllBenchmarks),
typeof(FindLastBenchmarks),
typeof(FindLastIndexBenchmarks)
//typeof(BinarySearchBenchmarks),
typeof(BinarySearchBenchmarksBestAndWorstCasesWhenConstrainedRange),
//typeof(BinarySearchValueLowerThanFirstItemBenchmarks),
//typeof(BinarySearchValueHigherThanFirstItemBenchmarks),
//typeof(ConvertAllBenchmarks),
//typeof(ExistsBenchmarks),
//typeof(FindBenchmarks),
//typeof(FindAllBenchmarks),
//typeof(FindLastBenchmarks),
//typeof(FindLastIndexBenchmarks)
}, BenchmarkConfig);
}
}
@@ -10,9 +10,10 @@ namespace Recyclable.Collections.Compatibility.List.Benchmarks
public override CollectionsBenchmarksSource BaseDataType { get => base.BaseDataType; set => base.BaseDataType = value; }
[Params(
CollectionsBenchmarksSource.List,
CollectionsBenchmarksSource.PooledList,
CollectionsBenchmarksSource.RecyclableList
//CollectionsBenchmarksSource.List,
//CollectionsBenchmarksSource.PooledList,
//CollectionsBenchmarksSource.RecyclableList,
CollectionsBenchmarksSource.RecyclableLongList
)]
public override CollectionsBenchmarksSource DataType { get => base.DataType; set => base.DataType = value; }