From 29f58e305983bf4b163972e9dbc877d4170db61b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Tue, 28 Oct 2025 15:11:21 +0100 Subject: [PATCH] Refactor by-divisor scheduling to use task thread pool --- .../MersenneNumberDivisorByDivisorTester.cs | 38 +++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs b/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs index 4ad9c46..fe30b0b 100644 --- a/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs +++ b/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs @@ -1,5 +1,6 @@ using System.Buffers; -using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; using System.Globalization; using System.Runtime.InteropServices; @@ -266,12 +267,7 @@ public static class MersenneNumberDivisorByDivisorTester } else { - var scheduler = UnboundedTaskScheduler.Instance; - ParallelOptions options = new() - { - MaxDegreeOfParallelism = workerCount, - TaskScheduler = scheduler - }; + TaskScheduler scheduler = UnboundedTaskScheduler.Instance; int totalCount = filteredPrimes.Count; int partitionSize = chunkSize < 1 ? 1 : chunkSize; @@ -280,13 +276,33 @@ public static class MersenneNumberDivisorByDivisorTester partitionSize = totalCount; } - Parallel.ForEach(Partitioner.Create(0, totalCount, partitionSize), options, range => + int taskCount = (totalCount + partitionSize - 1) / partitionSize; + Task[] tasks = new Task[taskCount]; + int taskIndex = 0; + + for (int start = 0; start < totalCount; start += partitionSize) { - for (int index = range.Item1; index < range.Item2; index++) + int rangeStart = start; + int rangeEnd = rangeStart + partitionSize; + if (rangeEnd > totalCount) { - ProcessPrime(filteredPrimes[index]); + rangeEnd = totalCount; } - }); + + tasks[taskIndex++] = Task.Factory.StartNew( + () => + { + for (int index = rangeStart; index < rangeEnd; index++) + { + ProcessPrime(filteredPrimes[index]); + } + }, + CancellationToken.None, + TaskCreationOptions.DenyChildAttach, + scheduler); + } + + Task.WaitAll(tasks); } } }