From 9c378db18fe01b6352fc97a1077ea20ed65af785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Sun, 12 Oct 2025 00:36:20 +0200 Subject: [PATCH] Use Parallel.ForEach for grouped by-divisor work items --- .../MersenneNumberDivisorByDivisorTester.cs | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs b/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs index e4f85fa..08b7126 100644 --- a/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs +++ b/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs @@ -272,7 +272,7 @@ public static class MersenneNumberDivisorByDivisorTester return; } - Task[] workers = new Task[workerCount]; + (int Start, int End)[] workerRanges = new (int, int)[workerCount]; int totalPrimeCount = filteredPrimes.Count; int baseGroupSize = totalPrimeCount / workerCount; int remaining = totalPrimeCount % workerCount; @@ -288,17 +288,21 @@ public static class MersenneNumberDivisorByDivisorTester int startIndex = groupStartIndex; int endIndex = startIndex + groupSize; + workerRanges[workerIndex] = (startIndex, endIndex); groupStartIndex = endIndex; - - workers[workerIndex] = Task.Run(() => - { - for (int candidateIndex = startIndex; candidateIndex < endIndex; candidateIndex++) - { - ProcessPrime(filteredPrimes[candidateIndex]); - } - }); } - Task.WaitAll(workers); + ParallelOptions parallelOptions = new() + { + MaxDegreeOfParallelism = workerCount + }; + + Parallel.ForEach(workerRanges, parallelOptions, range => + { + for (int candidateIndex = range.Start; candidateIndex < range.End; candidateIndex++) + { + ProcessPrime(filteredPrimes[candidateIndex]); + } + }); } }