PartialFactorPendingEntry changed back to struct for better performance.
This commit is contained in:
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;
|
namespace PerfectNumbers.Core;
|
||||||
|
|
||||||
public sealed class PartialFactorPendingEntry(ulong value, bool knownComposite)
|
public struct PartialFactorPendingEntry(ulong value, bool knownComposite)
|
||||||
{
|
{
|
||||||
[ThreadStatic]
|
public readonly ulong Value = value;
|
||||||
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 bool KnownComposite = knownComposite;
|
public bool KnownComposite = knownComposite;
|
||||||
public bool HasKnownPrimality = knownComposite;
|
public bool HasKnownPrimality = knownComposite;
|
||||||
public bool IsPrime = false;
|
public bool IsPrime = false;
|
||||||
|
|||||||
@@ -1336,13 +1336,15 @@ internal static partial class PrimeOrderCalculator
|
|||||||
{
|
{
|
||||||
while (compositeStack.Count > 0)
|
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
|
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);
|
cofactor = checked(cofactor * composite);
|
||||||
cofactorContainsComposite = true;
|
cofactorContainsComposite = true;
|
||||||
PartialFactorPendingEntry.Return(entry);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1382,8 +1383,6 @@ internal static partial class PrimeOrderCalculator
|
|||||||
cofactor = checked(cofactor * composite);
|
cofactor = checked(cofactor * composite);
|
||||||
cofactorContainsComposite = true;
|
cofactorContainsComposite = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
PartialFactorPendingEntry.Return(entry);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cofactorIsPrime;
|
bool cofactorIsPrime;
|
||||||
@@ -1442,13 +1441,13 @@ internal static partial class PrimeOrderCalculator
|
|||||||
pollardRhoDeadlineReached = Stopwatch.GetTimestamp() > deadlineTimestamp;
|
pollardRhoDeadlineReached = Stopwatch.GetTimestamp() > deadlineTimestamp;
|
||||||
if (pollardRhoDeadlineReached)
|
if (pollardRhoDeadlineReached)
|
||||||
{
|
{
|
||||||
pending.Add(PartialFactorPendingEntry.Rent(composite, knownComposite: true));
|
pending.Add(new (composite, knownComposite: true));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TryPollardRhoCpu(composite, deadlineTimestamp, out ulong factor))
|
if (!TryPollardRhoCpu(composite, deadlineTimestamp, out ulong factor))
|
||||||
{
|
{
|
||||||
pending.Add(PartialFactorPendingEntry.Rent(composite, knownComposite: true));
|
pending.Add(new (composite, knownComposite: true));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user