RecyclableList.ResizeAndCopy moved back to RecyclableListHelpers.
This commit is contained in:
1 parent
b1bcd8ea03
commit
fe77863bba
2 files changed
+30
-32
No files matched your search
@@ -227,6 +227,35 @@ namespace Recyclable.Collections
|
|||||||
|
|
||||||
private static readonly bool NeedsClearing = !typeof(T).IsValueType;
|
private static readonly bool NeedsClearing = !typeof(T).IsValueType;
|
||||||
|
|
||||||
|
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
|
public static void ResizeAndCopy(RecyclableList<T> list)
|
||||||
|
{
|
||||||
|
// TODO: Measure performance
|
||||||
|
// T[] newMemoryBlock = RecyclableListHelpers<T>._arrayPool.Rent(_capacity <<= 1);
|
||||||
|
T[] oldMemoryBlock = list._memoryBlock;
|
||||||
|
list._memoryBlock = (list._capacity <<= 1) < RecyclableDefaults.MinPooledArrayLength
|
||||||
|
? new T[list._capacity]
|
||||||
|
: _arrayPool.Rent(list._capacity);
|
||||||
|
|
||||||
|
// & WAS SLOWER WITHOUT
|
||||||
|
new Span<T>(oldMemoryBlock).CopyTo(list._memoryBlock);
|
||||||
|
|
||||||
|
if (oldMemoryBlock.Length >= RecyclableDefaults.MinPooledArrayLength)
|
||||||
|
{
|
||||||
|
// TODO: Measure gain vs relying on arrayPool to clear
|
||||||
|
//if (NeedsClearing)
|
||||||
|
//{
|
||||||
|
// Array.Clear(source);
|
||||||
|
//}
|
||||||
|
|
||||||
|
// // If anything, it has been already cleared above, so we don't need to repeat it.
|
||||||
|
_arrayPool.Return(oldMemoryBlock, NeedsClearing);
|
||||||
|
}
|
||||||
|
|
||||||
|
// list._memoryBlock = newMemoryBlock;
|
||||||
|
list._capacity = list._memoryBlock.Length;
|
||||||
|
}
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)]
|
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public static void ResizeAndCopy(RecyclableList<T> sourceList, int newSize)
|
public static void ResizeAndCopy(RecyclableList<T> sourceList, int newSize)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -183,43 +183,12 @@ namespace Recyclable.Collections
|
|||||||
|
|
||||||
public bool IsReadOnly => false;
|
public bool IsReadOnly => false;
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)]
|
|
||||||
private void ResizeAndCopy()
|
|
||||||
{
|
|
||||||
// TODO: Measure performance
|
|
||||||
// ArrayPool<T> arrayPool = _arrayPool;
|
|
||||||
// TODO: Measure performance after RecyclableArrayPool is reworked
|
|
||||||
// T[] newMemoryBlock = RecyclableListHelpers<T>._arrayPool.Rent(_capacity <<= 1);
|
|
||||||
T[] newMemoryBlock = (_capacity <<= 1) >= RecyclableDefaults.MinPooledArrayLength
|
|
||||||
? RecyclableListHelpers<T>._arrayPool.Rent(_capacity)
|
|
||||||
: new T[_capacity];
|
|
||||||
|
|
||||||
// & WAS SLOWER WITHOUT
|
|
||||||
T[] oldMemoryBlock = _memoryBlock;
|
|
||||||
new Span<T>(oldMemoryBlock).CopyTo(newMemoryBlock);
|
|
||||||
|
|
||||||
if (oldMemoryBlock.Length >= RecyclableDefaults.MinPooledArrayLength)
|
|
||||||
{
|
|
||||||
// TODO: Measure gain vs relying on arrayPool to clear
|
|
||||||
//if (NeedsClearing)
|
|
||||||
//{
|
|
||||||
// Array.Clear(source);
|
|
||||||
//}
|
|
||||||
|
|
||||||
// // If anything, it has been already cleared above, so we don't need to repeat it.
|
|
||||||
RecyclableListHelpers<T>._arrayPool.Return(oldMemoryBlock, NeedsClearing);
|
|
||||||
}
|
|
||||||
|
|
||||||
_memoryBlock = newMemoryBlock;
|
|
||||||
_capacity = newMemoryBlock.Length;
|
|
||||||
}
|
|
||||||
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public void Add(T item)
|
public void Add(T item)
|
||||||
{
|
{
|
||||||
if (_count == _capacity)
|
if (_count == _capacity)
|
||||||
{
|
{
|
||||||
ResizeAndCopy();
|
RecyclableListHelpers<T>.ResizeAndCopy(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
_memoryBlock[_count++] = item;
|
_memoryBlock[_count++] = item;
|
||||||
|
|||||||
Reference in new issue
Block a user