ARTICLE AD BOX
I have written a small program to create an increasing amount of tasks that do some work. I would expect the throughput for each task to be fairly consistent up until the point you have more tasks than CPU cores. However on my 28 core CPU the per task throughput starts dropping off after only creating 7 tasks, even though my task manager shows the CPU isn't even near 100%. Is this reduction in per task throughout purely due to task scheduling and context switching or am I doing something wrong? Any help would be greatly appreciated 😊
class Program { static async Task Main() { var results = new Dictionary<int, double>(); for (int workers = 1; workers <= Environment.ProcessorCount; workers++) { Console.WriteLine($"Running {workers} worker(s)"); long iterationsPerTask = 1_000_000_000L; var tasks = new Task[workers]; for (int i = 0; i < workers; i++) { tasks[i] = Task.Run(() => { for (long j = 0; j < iterationsPerTask; j++) { _ = Math.Sqrt(j); } }); } var sw = Stopwatch.StartNew(); await Task.WhenAll(tasks); sw.Stop(); double perTaskThroughput = iterationsPerTask / sw.Elapsed.TotalSeconds; results[workers] = perTaskThroughput; } foreach (var kvp in results) { Console.WriteLine($"{kvp.Key} Task(s): {kvp.Value:F2} iterations/sec per task"); } } }Program Output:
1 Task(s): 862577216.83 iterations/sec per task 2 Task(s): 858382140.23 iterations/sec per task 3 Task(s): 854105900.59 iterations/sec per task 4 Task(s): 840623005.88 iterations/sec per task 5 Task(s): 822938522.54 iterations/sec per task 6 Task(s): 847491885.90 iterations/sec per task 7 Task(s): 743713777.89 iterations/sec per task 8 Task(s): 794026695.97 iterations/sec per task 9 Task(s): 708545584.07 iterations/sec per task 10 Task(s): 690518224.95 iterations/sec per task 11 Task(s): 546421214.26 iterations/sec per task 12 Task(s): 583497432.26 iterations/sec per task 13 Task(s): 538722280.05 iterations/sec per task 14 Task(s): 563382376.52 iterations/sec per task 15 Task(s): 496078991.65 iterations/sec per task 16 Task(s): 478787579.62 iterations/sec per task 17 Task(s): 470389210.85 iterations/sec per task 18 Task(s): 463099341.43 iterations/sec per task 19 Task(s): 460345324.36 iterations/sec per task 20 Task(s): 419529729.83 iterations/sec per task 21 Task(s): 406272737.31 iterations/sec per task 22 Task(s): 380857188.42 iterations/sec per task 23 Task(s): 358325253.70 iterations/sec per task 24 Task(s): 362119687.87 iterations/sec per task 25 Task(s): 359521360.58 iterations/sec per task 26 Task(s): 338084788.22 iterations/sec per task 27 Task(s): 326119908.81 iterations/sec per task 28 Task(s): 311528692.48 iterations/sec per task