PartialFactorPendingEntry changed back to struct for better performance.

This commit is contained in:
mlemanczyk committed 2025-12-13 14:26:55 +01:00
1 parent a185149eba
commit 96bb6a4340
2 files changed
+8 -37

No files matched your search

@@ -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;
@@ -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;
}