Micro-optimizations and adjustments.

This commit is contained in:
mlemanczyk committed 2025-12-11 22:50:47 +01:00
1 parent 8f0cc17d90
commit 51284be4fb
3 files changed
+21 -9

No files matched your search

@@ -1,3 +1,4 @@
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
namespace PerfectNumbers.Core; namespace PerfectNumbers.Core;
@@ -29,7 +30,11 @@ public sealed class ConcurrentFixedCapacityStack<T>(int capacity)
public T? Pop() => TryPop(out T? item) ? item : default; public T? Pop() => TryPop(out T? item) ? item : default;
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public bool TryPop(out T? item) /// <summary>
/// Tries popping the first element from the stack. It doesn't clear the internal memory buffer from unused references.
/// </summary>
/// <returns>Returns false when the stack is empty. Returns true otherwise. If the stack was not empty, item contains the first element from the stack.
public bool TryPop([NotNullWhen(true)] out T? item)
{ {
while (true) while (true)
{ {
@@ -43,7 +48,7 @@ public sealed class ConcurrentFixedCapacityStack<T>(int capacity)
int next = observed - 1; int next = observed - 1;
if (Interlocked.CompareExchange(ref _count, next, observed) == observed) if (Interlocked.CompareExchange(ref _count, next, observed) == observed)
{ {
item = _items[next]; item = _items[next]!;
return true; return true;
} }
} }
@@ -59,8 +64,7 @@ public sealed class ConcurrentFixedCapacityStack<T>(int capacity)
return; return;
} }
Interlocked.Decrement(ref _count); ArgumentOutOfRangeException.ThrowIfGreaterThan(next, _capacity);
throw new InvalidOperationException("Stack is full.");
} }
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
+3 -3
View File
@@ -6,7 +6,7 @@ namespace PerfectNumbers.Core
{ {
[ThreadStatic] [ThreadStatic]
private static FixedCapacityArrayPool<T>? _arrayPool; private static FixedCapacityArrayPool<T>? _arrayPool;
internal static FixedCapacityArrayPool<T> ExclusiveArray public static FixedCapacityArrayPool<T> ExclusiveArray
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
@@ -18,7 +18,7 @@ namespace PerfectNumbers.Core
{ {
[ThreadStatic] [ThreadStatic]
private static IntArrayPool? _intArrayPool; private static IntArrayPool? _intArrayPool;
internal static IntArrayPool ExclusiveIntArray public static IntArrayPool ExclusiveIntArray
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
@@ -27,7 +27,7 @@ namespace PerfectNumbers.Core
[ThreadStatic] [ThreadStatic]
private static UlongArrayPool? _ulongArrayPool; private static UlongArrayPool? _ulongArrayPool;
internal static UlongArrayPool ExclusiveUlongArray public static UlongArrayPool ExclusiveUlongArray
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
+10 -2
View File
@@ -27,9 +27,16 @@ public sealed class FixedCapacityStack<T>(int capacity)
} }
} }
/// <summary>
/// Sets the no. of elements on the stack to 0. It doesn't clear the internal memory buffer from unused references.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public void Clear() => Count = 0; public void Clear() => Count = 0;
/// <summary>
/// Pops and returns the first element from the stack. It doesn't clear the internal memory buffer from unused references.
/// </summary>
/// <returns>The first element on the stack or null / default when the stack is empty.
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public T? Pop() => Count > 0 ? _items[Count--] : default; public T? Pop() => Count > 0 ? _items[Count--] : default;
@@ -37,9 +44,10 @@ public sealed class FixedCapacityStack<T>(int capacity)
public void Push(T item) public void Push(T item)
{ {
int newCount = Count + 1; int newCount = Count + 1;
if (newCount < _items.Length) T[] items = _items;
if (newCount < items.Length)
{ {
_items[newCount] = item; items[newCount] = item;
Count = newCount; Count = newCount;
} }
} }