From 4b2722f15aa67443d78ca016fa5b3261094a37b0 Mon Sep 17 00:00:00 2001 From: mlemanczyk Date: Sat, 16 Sep 2023 21:14:58 +0200 Subject: [PATCH] SetupBlockArrayPooling method removed for better performance. --- .../RecyclableLongList.Helpers.cs | 7 - Recyclable.Collections/RecyclableLongList.cs | 136 +++++++++++------- 2 files changed, 86 insertions(+), 57 deletions(-) diff --git a/Recyclable.Collections/RecyclableLongList.Helpers.cs b/Recyclable.Collections/RecyclableLongList.Helpers.cs index 8101919..8848b0f 100644 --- a/Recyclable.Collections/RecyclableLongList.Helpers.cs +++ b/Recyclable.Collections/RecyclableLongList.Helpers.cs @@ -195,13 +195,6 @@ namespace Recyclable.Collections return requiredBlockCount << minBlockSizePow2Shift; } - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public static void SetupBlockArrayPooling(RecyclableLongList list, int blockSize) - { - list._blockSize = blockSize; - list._blockSizePow2BitShift = (byte)(31 - BitOperations.LeadingZeroCount((uint)blockSize)); - } - #pragma warning disable CA2208 public static void ThrowIndexOutOfRangeException(in string message) => throw new ArgumentOutOfRangeException("index", message); #pragma warning restore CA2208 diff --git a/Recyclable.Collections/RecyclableLongList.cs b/Recyclable.Collections/RecyclableLongList.cs index bd23eb9..7f925ca 100644 --- a/Recyclable.Collections/RecyclableLongList.cs +++ b/Recyclable.Collections/RecyclableLongList.cs @@ -67,10 +67,14 @@ namespace Recyclable.Collections public RecyclableLongList(in T[] source, int minBlockSize = RecyclableDefaults.BlockSize) { - minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + if (!BitOperations.IsPow2(minBlockSize)) + { + minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + } - Helpers.SetupBlockArrayPooling(this, minBlockSize); - _capacity = Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)source.LongLength))); + _blockSizePow2BitShift = (byte)(31 - BitOperations.LeadingZeroCount((uint)minBlockSize)); + _capacity = RecyclableLongList.Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)source.LongLength))); + _blockSize = minBlockSize; _blockSizeMinus1 = minBlockSize - 1; zRecyclableLongListAddRange.AddRange(this, source); @@ -78,10 +82,14 @@ namespace Recyclable.Collections public RecyclableLongList(in Array source, int minBlockSize = RecyclableDefaults.BlockSize) { - minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + if (!BitOperations.IsPow2(minBlockSize)) + { + minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + } - Helpers.SetupBlockArrayPooling(this, minBlockSize); - _capacity = Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)source.LongLength))); + _blockSizePow2BitShift = (byte)(31 - BitOperations.LeadingZeroCount((uint)minBlockSize)); + _capacity = RecyclableLongList.Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)source.LongLength))); + _blockSize = minBlockSize; _blockSizeMinus1 = minBlockSize - 1; zRecyclableLongListAddRange.AddRange(this, source); @@ -89,10 +97,14 @@ namespace Recyclable.Collections public RecyclableLongList(IReadOnlyList source, int minBlockSize = RecyclableDefaults.BlockSize) { - minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + if (!BitOperations.IsPow2(minBlockSize)) + { + minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + } - Helpers.SetupBlockArrayPooling(this, minBlockSize); - _capacity = Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, BitOperations.RoundUpToPowerOf2((uint)source.Count)); + _blockSizePow2BitShift = (byte)(31 - BitOperations.LeadingZeroCount((uint)minBlockSize)); + _capacity = RecyclableLongList.Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)source.Count))); + _blockSize = minBlockSize; _blockSizeMinus1 = minBlockSize - 1; zRecyclableLongListAddRange.AddRange(this, source); @@ -100,10 +112,14 @@ namespace Recyclable.Collections public RecyclableLongList(ReadOnlySpan source, int minBlockSize = RecyclableDefaults.BlockSize) { - minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + if (!BitOperations.IsPow2(minBlockSize)) + { + minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + } - Helpers.SetupBlockArrayPooling(this, minBlockSize); - _capacity = Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)source.Length))); + _blockSizePow2BitShift = (byte)(31 - BitOperations.LeadingZeroCount((uint)minBlockSize)); + _capacity = RecyclableLongList.Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)source.Length))); + _blockSize = minBlockSize; _blockSizeMinus1 = minBlockSize - 1; zRecyclableLongListAddRange.AddRange(this, source); @@ -111,10 +127,14 @@ namespace Recyclable.Collections public RecyclableLongList(RecyclableList source, int minBlockSize = RecyclableDefaults.BlockSize) { - minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + if (!BitOperations.IsPow2(minBlockSize)) + { + minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + } - Helpers.SetupBlockArrayPooling(this, minBlockSize); - _capacity = Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, BitOperations.RoundUpToPowerOf2((uint)source.Count)); + _blockSizePow2BitShift = (byte)(31 - BitOperations.LeadingZeroCount((uint)minBlockSize)); + _capacity = RecyclableLongList.Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)source.Count))); + _blockSize = minBlockSize; _blockSizeMinus1 = minBlockSize - 1; zRecyclableLongListAddRange.AddRange(this, source); @@ -122,10 +142,14 @@ namespace Recyclable.Collections public RecyclableLongList(RecyclableLongList source, int minBlockSize = RecyclableDefaults.BlockSize) { - minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + if (!BitOperations.IsPow2(minBlockSize)) + { + minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + } - Helpers.SetupBlockArrayPooling(this, minBlockSize); - _capacity = Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)source.Count))); + _blockSizePow2BitShift = (byte)(31 - BitOperations.LeadingZeroCount((uint)minBlockSize)); + _capacity = RecyclableLongList.Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)source.Count))); + _blockSize = minBlockSize; _blockSizeMinus1 = minBlockSize - 1; zRecyclableLongListAddRange.AddRange(this, source); @@ -133,10 +157,14 @@ namespace Recyclable.Collections public RecyclableLongList(Span source, int minBlockSize = RecyclableDefaults.BlockSize) { - minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + if (!BitOperations.IsPow2(minBlockSize)) + { + minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + } - Helpers.SetupBlockArrayPooling(this, minBlockSize); - _capacity = Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)source.Length))); + _blockSizePow2BitShift = (byte)(31 - BitOperations.LeadingZeroCount((uint)minBlockSize)); + _capacity = RecyclableLongList.Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)source.Length))); + _blockSize = minBlockSize; _blockSizeMinus1 = minBlockSize - 1; zRecyclableLongListAddRange.AddRange(this, source); @@ -144,10 +172,14 @@ namespace Recyclable.Collections public RecyclableLongList(List source, int minBlockSize = RecyclableDefaults.BlockSize) { - minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + if (!BitOperations.IsPow2(minBlockSize)) + { + minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + } - Helpers.SetupBlockArrayPooling(this, minBlockSize); - _capacity = Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, BitOperations.RoundUpToPowerOf2((uint)source.Count)); + _blockSizePow2BitShift = (byte)(31 - BitOperations.LeadingZeroCount((uint)minBlockSize)); + _capacity = RecyclableLongList.Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)source.Count))); + _blockSize = minBlockSize; _blockSizeMinus1 = minBlockSize - 1; zRecyclableLongListAddRange.AddRange(this, source); @@ -155,10 +187,14 @@ namespace Recyclable.Collections public RecyclableLongList(ICollection source, int minBlockSize = RecyclableDefaults.BlockSize) { - minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + if (!BitOperations.IsPow2(minBlockSize)) + { + minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + } - Helpers.SetupBlockArrayPooling(this, minBlockSize); - _capacity = Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, BitOperations.RoundUpToPowerOf2((uint)source.Count)); + _blockSizePow2BitShift = (byte)(31 - BitOperations.LeadingZeroCount((uint)minBlockSize)); + _capacity = RecyclableLongList.Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)source.Count))); + _blockSize = minBlockSize; _blockSizeMinus1 = minBlockSize - 1; zRecyclableLongListAddRange.AddRange(this, source); @@ -166,46 +202,46 @@ namespace Recyclable.Collections public RecyclableLongList(ICollection source, int minBlockSize = RecyclableDefaults.BlockSize) { - minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + if (!BitOperations.IsPow2(minBlockSize)) + { + minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); + } - Helpers.SetupBlockArrayPooling(this, minBlockSize); - _capacity = Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, BitOperations.RoundUpToPowerOf2((uint)source.Count)); + _blockSizePow2BitShift = (byte)(31 - BitOperations.LeadingZeroCount((uint)minBlockSize)); + _capacity = RecyclableLongList.Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)source.Count))); + _blockSize = minBlockSize; _blockSizeMinus1 = minBlockSize - 1; zRecyclableLongListAddRange.AddRange(this, source); } - public RecyclableLongList(IEnumerable source, int minBlockSize = RecyclableDefaults.BlockSize, long? initialCapacity = default) + public RecyclableLongList(IEnumerable source, int minBlockSize = RecyclableDefaults.BlockSize, long initialCapacity = RecyclableDefaults.InitialCapacity) { - Helpers.SetupBlockArrayPooling(this, minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize))); - if (initialCapacity > 0) + if (!BitOperations.IsPow2(minBlockSize)) { - _capacity = Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((int)BitOperations.RoundUpToPowerOf2((uint)initialCapacity.Value))); - _blockSizeMinus1 = minBlockSize - 1; - } - else - { - _blockSizeMinus1 = _blockSize - 1; - _memoryBlocks = _emptyMemoryBlocksArray; + minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); } + _blockSizePow2BitShift = (byte)(31 - BitOperations.LeadingZeroCount((uint)minBlockSize)); + _capacity = RecyclableLongList.Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)initialCapacity))); + _blockSize = minBlockSize; + _blockSizeMinus1 = minBlockSize - 1; + zRecyclableLongListAddRange.AddRange(this, source); } - public RecyclableLongList(IEnumerable source, int minBlockSize = RecyclableDefaults.BlockSize, long? initialCapacity = default) + public RecyclableLongList(IEnumerable source, int minBlockSize = RecyclableDefaults.BlockSize, long initialCapacity = RecyclableDefaults.InitialCapacity) { - Helpers.SetupBlockArrayPooling(this, minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize))); - if (initialCapacity > 0) + if (!BitOperations.IsPow2(minBlockSize)) { - _capacity = Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((int)BitOperations.RoundUpToPowerOf2((uint)initialCapacity.Value))); - _blockSizeMinus1 = minBlockSize - 1; - } - else - { - _blockSizeMinus1 = _blockSize - 1; - _memoryBlocks = _emptyMemoryBlocksArray; + minBlockSize = checked((int)BitOperations.RoundUpToPowerOf2((uint)minBlockSize)); } + _blockSizePow2BitShift = (byte)(31 - BitOperations.LeadingZeroCount((uint)minBlockSize)); + _capacity = RecyclableLongList.Helpers.Resize(this, minBlockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)initialCapacity))); + _blockSize = minBlockSize; + _blockSizeMinus1 = minBlockSize - 1; + zRecyclableLongListAddRange.AddRange(this, source); }