diff --git a/PerfectNumbers.Core/PartialFactorPendingEntry.cs b/PerfectNumbers.Core/PartialFactorPendingEntry.cs index c6f541d..7992ee4 100644 --- a/PerfectNumbers.Core/PartialFactorPendingEntry.cs +++ b/PerfectNumbers.Core/PartialFactorPendingEntry.cs @@ -2,37 +2,9 @@ using System.Runtime.CompilerServices; namespace PerfectNumbers.Core; -public sealed class PartialFactorPendingEntry(ulong value, bool knownComposite) +public struct PartialFactorPendingEntry(ulong value, bool knownComposite) { - [ThreadStatic] - private static PartialFactorPendingEntry? _poolHead; - private PartialFactorPendingEntry? _next; - - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public static PartialFactorPendingEntry Rent(ulong value, bool knownComposite) - { - var poolHead = _poolHead; - if (poolHead == null) - { - return new(value, knownComposite); - } - - _poolHead = poolHead._next; - poolHead.Value = value; - poolHead.KnownComposite = knownComposite; - poolHead.HasKnownPrimality = knownComposite; - poolHead.IsPrime = false; - return poolHead; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] - public static void Return(PartialFactorPendingEntry entry) - { - entry._next = _poolHead; - _poolHead = entry; - } - - public ulong Value = value; + public readonly ulong Value = value; public bool KnownComposite = knownComposite; public bool HasKnownPrimality = knownComposite; public bool IsPrime = false; diff --git a/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs b/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs index da43a29..5864b52 100644 --- a/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs +++ b/PerfectNumbers.Core/PrimeOrderCalculator.Cpu.cs @@ -1336,13 +1336,15 @@ internal static partial class PrimeOrderCalculator { while (compositeStack.Count > 0) { - pending.Add(PartialFactorPendingEntry.Rent(compositeStack.Pop(), knownComposite: false)); + pending.Add(new(compositeStack.Pop(), knownComposite: false)); + // pending.Add(PartialFactorPendingEntry.Rent(compositeStack.Pop(), knownComposite: false)); } } } else { - pending.Add(PartialFactorPendingEntry.Rent(remaining, knownComposite: false)); + pending.Add(new (remaining, knownComposite: false)); + // pending.Add(PartialFactorPendingEntry.Rent(remaining, knownComposite: false)); } } @@ -1360,7 +1362,6 @@ internal static partial class PrimeOrderCalculator { cofactor = checked(cofactor * composite); cofactorContainsComposite = true; - PartialFactorPendingEntry.Return(entry); continue; } @@ -1382,8 +1383,6 @@ internal static partial class PrimeOrderCalculator cofactor = checked(cofactor * composite); cofactorContainsComposite = true; } - - PartialFactorPendingEntry.Return(entry); } bool cofactorIsPrime; @@ -1442,13 +1441,13 @@ internal static partial class PrimeOrderCalculator pollardRhoDeadlineReached = Stopwatch.GetTimestamp() > deadlineTimestamp; if (pollardRhoDeadlineReached) { - pending.Add(PartialFactorPendingEntry.Rent(composite, knownComposite: true)); + pending.Add(new (composite, knownComposite: true)); continue; } if (!TryPollardRhoCpu(composite, deadlineTimestamp, out ulong factor)) { - pending.Add(PartialFactorPendingEntry.Rent(composite, knownComposite: true)); + pending.Add(new (composite, knownComposite: true)); continue; }