From eae153e4a494b9c0b69e0d5e8ed6c87cc105f9d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Thu, 9 Oct 2025 03:51:56 +0200 Subject: [PATCH] Replace status modulo with subtract loop --- .../MersenneNumberDivisorByDivisorCpuTester.cs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs b/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs index 2eba0ce..194a642 100644 --- a/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs +++ b/PerfectNumbers.Core/Cpu/MersenneNumberDivisorByDivisorCpuTester.cs @@ -95,7 +95,7 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv { lock (_sync) { - UpdateStatusUnsafe(lastProcessed, processedCount); + UpdateStatusUnsafe(processedCount); } } @@ -283,7 +283,7 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv return (byte)sum; } - private void UpdateStatusUnsafe(ulong lastProcessed, ulong processedCount) + private void UpdateStatusUnsafe(ulong processedCount) { if (processedCount == 0UL) { @@ -298,9 +298,16 @@ public sealed class MersenneNumberDivisorByDivisorCpuTester : IMersenneNumberDiv } ulong total = _lastStatusDivisor + processedCount; - // TODO: Replace this modulo with the ring-buffer style counter (subtract loop) used in the fast CLI - // status benchmarks so we avoid `%` in this hot loop while still wrapping progress correctly. - _lastStatusDivisor = total % interval; + if (total >= interval) + { + do + { + total -= interval; + } + while (total >= interval); + } + + _lastStatusDivisor = total; } private static ulong ComputeDivisorLimitFromMaxPrime(ulong maxPrime)