Производительность .NET не масштабируется линейно в зависимости от количества ядер.C#

Место общения программистов C#
Ответить
Anonymous
 Производительность .NET не масштабируется линейно в зависимости от количества ядер.

Сообщение Anonymous »

Я написал небольшую программу для создания растущего количества задач, выполняющих определенную работу.
Я ожидаю, что пропускная способность для каждой задачи будет достаточно постоянной до тех пор, пока у вас не будет больше задач, чем ядер ЦП.
Однако на моем 28-ядерном ЦП пропускная способность на каждую задачу начинает падать после создания только 7 задач, хотя мой диспетчер задач показывает, что ЦП даже близко не 100%.
Это снижение производительности на каждую задачу исключительно из-за задачи планирование и переключение контекста или я делаю что-то не так?
Буду благодарен за любую помощь 😊
class Program
{
static async Task Main()
{
var results = new Dictionary();

for (int workers = 1; workers
{
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");
}
}
}

Вывод программы:
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


Подробнее здесь: https://stackoverflow.com/questions/798 ... core-count
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»