diff --git a/EvenPerfectBitScanner.Tests/ProgramTests.cs b/EvenPerfectBitScanner.Tests/ProgramTests.cs index 5e9e5eb..0e56a0c 100644 --- a/EvenPerfectBitScanner.Tests/ProgramTests.cs +++ b/EvenPerfectBitScanner.Tests/ProgramTests.cs @@ -404,12 +404,18 @@ public class ProgramTests var outputField = typeof(Program).GetField("_outputBuilder", BindingFlags.NonPublic | BindingFlags.Static)!; var writeIndexField = typeof(Program).GetField("_writeIndex", BindingFlags.NonPublic | BindingFlags.Static)!; var compositeField = typeof(Program).GetField("_lastCompositeP", BindingFlags.NonPublic | BindingFlags.Static)!; + var primeCountField = typeof(Program).GetField("_primeCount", BindingFlags.NonPublic | BindingFlags.Static)!; + var primeFoundField = typeof(Program).GetField("_primeFoundAfterInit", BindingFlags.NonPublic | BindingFlags.Static)!; + var consoleCounterField = typeof(Program).GetField("_consoleCounter", BindingFlags.NonPublic | BindingFlags.Static)!; var printResult = typeof(Program).GetMethod("PrintResult", BindingFlags.NonPublic | BindingFlags.Static)!; var previousResidueMode = (bool)residueModeField.GetValue(null)!; var previousOutput = (StringBuilder?)outputField.GetValue(null); var previousWriteIndex = (int)writeIndexField.GetValue(null)!; var previousComposite = (bool)compositeField.GetValue(null)!; + var previousPrimeCount = (int)primeCountField.GetValue(null)!; + var previousPrimeFound = (bool)primeFoundField.GetValue(null)!; + var previousConsoleCounter = (int)consoleCounterField.GetValue(null)!; var builder = StringBuilderPool.Rent(); @@ -420,11 +426,19 @@ public class ProgramTests compositeField.SetValue(null, true); outputField.SetValue(null, builder); writeIndexField.SetValue(null, 0); + primeCountField.SetValue(null, 0); + primeFoundField.SetValue(null, false); + consoleCounterField.SetValue(null, 0); printResult.Invoke(null, new object[] { 9UL, false, false, false }); - builder.Length.Should().Be(0); + builder.ToString().Should().BeEmpty(); ((int)writeIndexField.GetValue(null)!).Should().Be(0); + + printResult.Invoke(null, new object[] { 11UL, true, false, true }); + + builder.ToString().Should().Be("11,True,False,True" + Environment.NewLine); + ((int)writeIndexField.GetValue(null)!).Should().Be(1); } finally { @@ -432,6 +446,9 @@ public class ProgramTests writeIndexField.SetValue(null, previousWriteIndex); residueModeField.SetValue(null, previousResidueMode); compositeField.SetValue(null, previousComposite); + primeCountField.SetValue(null, previousPrimeCount); + primeFoundField.SetValue(null, previousPrimeFound); + consoleCounterField.SetValue(null, previousConsoleCounter); builder.Clear(); StringBuilderPool.Return(builder); } diff --git a/EvenPerfectBitScanner/Program.cs b/EvenPerfectBitScanner/Program.cs index ab25b8e..2bb9aab 100644 --- a/EvenPerfectBitScanner/Program.cs +++ b/EvenPerfectBitScanner/Program.cs @@ -836,57 +836,70 @@ internal static class Program } } - if (_useResidueMode && _lastCompositeP) - { - return; - } + bool lastWasComposite = _lastCompositeP; + bool primeFlag = false, printToConsole = false; - bool primeFlag = false, printToConsole = false; + StringBuilder? localBuilder = passedAllTests ? StringBuilderPool.Rent() : null; + if (localBuilder is not null) + { + _ = localBuilder + .Append(currentP).Append(',') + .Append(searchedMersenne).Append(',') + .Append(detailedCheck).Append(',') + .Append(passedAllTests).Append('\n'); + } - StringBuilder localBuilder = StringBuilderPool.Rent(); - _ = localBuilder - .Append(currentP).Append(',') - .Append(searchedMersenne).Append(',') - .Append(detailedCheck).Append(',') - .Append(passedAllTests).Append('\n'); + lock (Sync) + { + if (_consoleCounter >= ConsoleInterval) + { + printToConsole = true; + primeFlag = passedAllTests && !lastWasComposite && _primeFoundAfterInit; + _consoleCounter = 0; + } + else + { + _consoleCounter++; + } - lock (Sync) - { - _ = _outputBuilder!.Append(localBuilder); + if (localBuilder is not null) + { + _ = _outputBuilder!.Append(localBuilder); - if (_consoleCounter >= ConsoleInterval) - { - printToConsole = true; - primeFlag = _primeFoundAfterInit; - _consoleCounter = 0; - } - else - { - _consoleCounter++; - } + _writeIndex++; + if (_writeIndex >= _writeBatchSize) + { + FlushBuffer(); + } + } + } - _writeIndex++; - if (_writeIndex >= _writeBatchSize) - { - FlushBuffer(); - } - } + if (printToConsole) + { + if (localBuilder is not null) + { + if (primeFlag) + { + _ = localBuilder + .Remove(localBuilder.Length - 1, 1) + .Append(PrimeFoundSuffix) + .Append('\n'); + } - if (printToConsole) - { - if (primeFlag) - { - _ = localBuilder - .Remove(localBuilder.Length - 1, 1) - .Append(PrimeFoundSuffix) - .Append('\n'); - } + Console.WriteLine(localBuilder.Remove(localBuilder.Length - 1, 1).ToString()); + } + else + { + Console.WriteLine($"{currentP},{searchedMersenne},{detailedCheck},{passedAllTests}"); + } + } - Console.WriteLine(localBuilder.Remove(localBuilder.Length - 1, 1).ToString()); - } - - StringBuilderPool.Return(localBuilder); - } + if (localBuilder is not null) + { + localBuilder.Clear(); + StringBuilderPool.Return(localBuilder); + } + } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void FlushBuffer()