RecyclableLongList.RemoveAt performance improvements.
This commit is contained in:
1 parent
ddb3a9b5ad
commit
2d8b203bf6
1 file changed
+10
-48
@@ -57,75 +57,37 @@ namespace Recyclable.Collections
|
|||||||
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)]
|
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)]
|
||||||
public static void CopyFollowingItems(RecyclableLongList<T> list, long destinationItemIndex)
|
public static void CopyFollowingItems(RecyclableLongList<T> list, long destinationItemIndex)
|
||||||
{
|
{
|
||||||
|
T[] currentBlock;
|
||||||
T[][] memoryBlocks = list._memoryBlocks;
|
T[][] memoryBlocks = list._memoryBlocks;
|
||||||
int blockSizeMinus1 = list._blockSizeMinus1,
|
int blockSizeMinus1 = list._blockSizeMinus1,
|
||||||
targetItemIndex = (int)(destinationItemIndex & blockSizeMinus1),
|
targetItemIndex = (int)(destinationItemIndex & blockSizeMinus1),
|
||||||
targetBlockIndex = (int)(destinationItemIndex >> list._blockSizePow2BitShift) + (targetItemIndex != 0 ? 1 : 0),
|
targetBlockIndex = (int)(destinationItemIndex >> list._blockSizePow2BitShift) + (targetItemIndex != 0 ? 1 : 0),
|
||||||
lastTakenBlockIndex = list._lastBlockWithData - 1;
|
lastTakenBlockIndex = list._lastBlockWithData - 1;
|
||||||
|
|
||||||
// long remainingItems,
|
|
||||||
// itemsCount = list._longCount;
|
|
||||||
|
|
||||||
// Each iteration should
|
// Each iteration should
|
||||||
// 1. copy the remaining items in the current block (those after the deleted item)
|
// 1. copy the remaining items in the current block (those after the deleted item)
|
||||||
// 2. copy the 1st item from the next block. We deleted 1 item which leaves 1 item gap in the block.
|
// 2. copy the 1st item from the next block. We deleted 1 item which leaves 1 item gap in the block.
|
||||||
// We need to fill it.
|
// We need to fill it.
|
||||||
// T[] currentMemoryBlock = memoryBlocks[targetBlockIndex];
|
currentBlock = memoryBlocks[targetBlockIndex];
|
||||||
if (targetItemIndex < blockSizeMinus1)
|
if (targetItemIndex < blockSizeMinus1)
|
||||||
{
|
{
|
||||||
// new Span<T>(currentMemoryBlock, targetItemIndex + 1, blockSizeMinus1 - targetItemIndex)
|
new Span<T>(currentBlock, targetItemIndex + 1, blockSizeMinus1 - targetItemIndex)
|
||||||
// .CopyTo(new Span<T>(currentMemoryBlock, targetItemIndex, blockSizeMinus1 - targetItemIndex));
|
.CopyTo(new Span<T>(currentBlock, targetItemIndex, blockSizeMinus1 - targetItemIndex));
|
||||||
// remainingItems = blockSizeMinus1 - targetItemIndex;
|
|
||||||
new Span<T>(memoryBlocks[targetBlockIndex], targetItemIndex + 1, blockSizeMinus1 - targetItemIndex)
|
|
||||||
.CopyTo(new Span<T>(memoryBlocks[targetBlockIndex], targetItemIndex, blockSizeMinus1 - targetItemIndex));
|
|
||||||
// new Span<T>(currentMemoryBlock, targetItemIndex + 1, unchecked((int)remainingItems))
|
|
||||||
// .CopyTo(new Span<T>(currentMemoryBlock, targetItemIndex, unchecked((int)remainingItems)));
|
|
||||||
// Array.Copy(currentMemoryBlock, targetItemIndex + 1, currentMemoryBlock, targetItemIndex, remainingItems);
|
|
||||||
}
|
}
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// remainingItems = destinationItemIndex;
|
|
||||||
// }
|
|
||||||
|
|
||||||
while (targetBlockIndex < lastTakenBlockIndex)
|
while (targetBlockIndex < lastTakenBlockIndex)
|
||||||
{
|
{
|
||||||
new Span<T>(memoryBlocks[targetBlockIndex])[blockSizeMinus1] = memoryBlocks[++targetBlockIndex][0];
|
new Span<T>(currentBlock)[blockSizeMinus1] = (currentBlock = memoryBlocks[++targetBlockIndex])[0];
|
||||||
// currentMemoryBlock[blockSizeMinus1] = memoryBlocks[++targetBlockIndex][0];
|
new Span<T>(currentBlock, 1, blockSizeMinus1)
|
||||||
// new Span<T>(currentMemoryBlock)[blockSizeMinus1] = memoryBlocks[++targetBlockIndex][0];
|
.CopyTo(new Span<T>(currentBlock));
|
||||||
// currentMemoryBlock = memoryBlocks[targetBlockIndex];
|
|
||||||
|
|
||||||
// if (remainingItems > 1)
|
|
||||||
// {
|
|
||||||
new Span<T>(memoryBlocks[targetBlockIndex], 1, blockSizeMinus1)
|
|
||||||
.CopyTo(new Span<T>(memoryBlocks[targetBlockIndex]));
|
|
||||||
// new Span<T>(currentMemoryBlock, 1, blockSizeMinus1)
|
|
||||||
// .CopyTo(new Span<T>(currentMemoryBlock));
|
|
||||||
// Array.Copy(currentMemoryBlock, 1, currentMemoryBlock, 0, blockSizeMinus1);
|
|
||||||
// remainingItems += blockSize;
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// remainingItems = 0;
|
|
||||||
// }
|
|
||||||
// new Span<T>(currentMemoryBlock, 1, blockSizeMinus1).CopyTo(new Span<T>(currentMemoryBlock));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastTakenBlockIndex >= 0)
|
if (lastTakenBlockIndex >= 0)
|
||||||
{
|
{
|
||||||
new Span<T>(memoryBlocks[targetBlockIndex])[blockSizeMinus1] = memoryBlocks[++targetBlockIndex][0];
|
new Span<T>(currentBlock)[blockSizeMinus1] = (currentBlock = memoryBlocks[targetBlockIndex + 1])[0];
|
||||||
if (list._nextItemIndex != 0)
|
new Span<T>(currentBlock, 1, list._nextItemIndex != 0 ? list._nextItemIndex - 1 : blockSizeMinus1)
|
||||||
{
|
.CopyTo(new Span<T>(currentBlock));
|
||||||
new Span<T>(memoryBlocks[targetBlockIndex], 1, list._nextItemIndex - 1)
|
|
||||||
.CopyTo(new Span<T>(memoryBlocks[targetBlockIndex]));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
new Span<T>(memoryBlocks[targetBlockIndex], 1, blockSizeMinus1)
|
|
||||||
.CopyTo(new Span<T>(memoryBlocks[targetBlockIndex]));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// currentMemoryBlock = memoryBlocks[lastTakenBlockIndex];
|
|
||||||
// Array.ConstrainedCopy(currentMemoryBlock, 1, currentMemoryBlock, 0, remainderLength);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CopyTo(T[][] sourceMemoryBlocks, long startingIndex, int blockSize, long itemsCount, T[] destinationArray, int destinationArrayIndex)
|
public static void CopyTo(T[][] sourceMemoryBlocks, long startingIndex, int blockSize, long itemsCount, T[] destinationArray, int destinationArrayIndex)
|
||||||
|
|||||||
Reference in new issue
Block a user