PartialFactorPendingEntry changed back to struct for better performance.
This commit is contained in:
1 parent
a185149eba
commit
079b2d5b72
2 files changed
+6
-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,13 @@ internal static partial class PrimeOrderCalculator
|
||||
{
|
||||
while (compositeStack.Count > 0)
|
||||
{
|
||||
pending.Add(PartialFactorPendingEntry.Rent(compositeStack.Pop(), knownComposite: false));
|
||||
pending.Add(new(compositeStack.Pop(), knownComposite: false));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pending.Add(PartialFactorPendingEntry.Rent(remaining, knownComposite: false));
|
||||
pending.Add(new (remaining, knownComposite: false));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1360,7 +1360,6 @@ internal static partial class PrimeOrderCalculator
|
||||
{
|
||||
cofactor = checked(cofactor * composite);
|
||||
cofactorContainsComposite = true;
|
||||
PartialFactorPendingEntry.Return(entry);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1382,8 +1381,6 @@ internal static partial class PrimeOrderCalculator
|
||||
cofactor = checked(cofactor * composite);
|
||||
cofactorContainsComposite = true;
|
||||
}
|
||||
|
||||
PartialFactorPendingEntry.Return(entry);
|
||||
}
|
||||
|
||||
bool cofactorIsPrime;
|
||||
@@ -1442,13 +1439,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;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user