RecyclableList.EnsureCapacity performance improvements.

This commit is contained in:
mlemanczyk committed 2023-04-09 01:54:52 +02:00
1 parent ed76bd99ba
commit a132fdc775
1 file changed
+16 -15
+16 -15
View File
@@ -119,7 +119,7 @@ namespace Recyclable.Collections
{ {
if (copied + growByCount > capacity) if (copied + growByCount > capacity)
{ {
capacity = EnsureCapacity(capacity + growByCount); capacity = EnsureCapacity(this, capacity + growByCount);
memoryBlocksCount = _memoryBlocks.Length; memoryBlocksCount = _memoryBlocks.Length;
if (blockSize != _blockSize) if (blockSize != _blockSize)
{ {
@@ -182,7 +182,7 @@ namespace Recyclable.Collections
long requiredCapacity = copied + requiredAdditionalCapacity; long requiredCapacity = copied + requiredAdditionalCapacity;
if (_capacity < requiredCapacity) if (_capacity < requiredCapacity)
{ {
_ = EnsureCapacity(requiredCapacity); _ = EnsureCapacity(this, requiredCapacity);
blockSize = _blockSize; blockSize = _blockSize;
} }
@@ -313,20 +313,21 @@ namespace Recyclable.Collections
return (long)newMemoryBlocks.Length << minBlockSizePowerToShift; return (long)newMemoryBlocks.Length << minBlockSizePowerToShift;
} }
protected long EnsureCapacity(long requestedCapacity) [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)]
public static long EnsureCapacity(RecyclableList<T> list, long requestedCapacity)
{ {
long newCapacity = _capacity > 0 long newCapacity = list._capacity > 0
? checked((long)BitOperations.RoundUpToPowerOf2((ulong)requestedCapacity)) ? checked((long)BitOperations.RoundUpToPowerOf2((ulong)requestedCapacity))
: requestedCapacity; : requestedCapacity;
newCapacity = Resize(ref _memoryBlocks!, _blockSize, _capacity, newCapacity, _memoryBlocksPool, _blockArrayPool); newCapacity = Resize(ref list._memoryBlocks!, list._blockSize, list._capacity, newCapacity, list._memoryBlocksPool, list._blockArrayPool);
if (newCapacity > 0 && _capacity == 0) if (newCapacity > 0 && list._capacity == 0)
{ {
_blockSize = _memoryBlocks[0].Length; list._blockSize = list._memoryBlocks[0].Length;
_blockSizePow2Shift = MathUtils.GetPow2Shift(_blockSize); list._blockSizePow2Shift = MathUtils.GetPow2Shift(list._blockSize);
} }
_capacity = newCapacity; list._capacity = newCapacity;
return newCapacity; return newCapacity;
} }
@@ -403,7 +404,7 @@ namespace Recyclable.Collections
{ {
if (_capacity < _longCount + 1) if (_capacity < _longCount + 1)
{ {
_ = EnsureCapacity(_longCount + 1); _ = EnsureCapacity(this, _longCount + 1);
} }
_memoryBlocks[_nextItemBlockIndex][_nextItemIndex++] = item; _memoryBlocks[_nextItemBlockIndex][_nextItemIndex++] = item;
@@ -426,7 +427,7 @@ namespace Recyclable.Collections
long targetCapacity = _longCount + items.LongLength; long targetCapacity = _longCount + items.LongLength;
if (_capacity < targetCapacity) if (_capacity < targetCapacity)
{ {
_ = EnsureCapacity(targetCapacity); _ = EnsureCapacity(this, targetCapacity);
} }
int blockSize = _blockSize, int blockSize = _blockSize,
@@ -469,7 +470,7 @@ namespace Recyclable.Collections
long targetCapacity = _longCount + items.Count; long targetCapacity = _longCount + items.Count;
if (_capacity < targetCapacity) if (_capacity < targetCapacity)
{ {
_ = EnsureCapacity(targetCapacity); _ = EnsureCapacity(this, targetCapacity);
} }
int blockSize = _blockSize, int blockSize = _blockSize,
@@ -510,7 +511,7 @@ namespace Recyclable.Collections
if (_capacity < targetCapacity) if (_capacity < targetCapacity)
{ {
_ = EnsureCapacity(targetCapacity); _ = EnsureCapacity(this, targetCapacity);
} }
int blockSize = _blockSize, int blockSize = _blockSize,
@@ -580,7 +581,7 @@ namespace Recyclable.Collections
long targetCapacity = _longCount + items.Count; long targetCapacity = _longCount + items.Count;
if (_capacity < targetCapacity) if (_capacity < targetCapacity)
{ {
_ = EnsureCapacity(targetCapacity); _ = EnsureCapacity(this, targetCapacity);
} }
int blockSize = _blockSize, int blockSize = _blockSize,
@@ -626,7 +627,7 @@ namespace Recyclable.Collections
long targetCapacity = _longCount + items.Count; long targetCapacity = _longCount + items.Count;
if (_capacity < targetCapacity) if (_capacity < targetCapacity)
{ {
_ = EnsureCapacity(targetCapacity); _ = EnsureCapacity(this, targetCapacity);
} }
int blockSize = _blockSize, int blockSize = _blockSize,