Правильный способ применения параллельного программирования на ядрах - PullRequest
0 голосов
/ 16 апреля 2020

Как правильно распределить операции по ядрам. Где у меня четыре ядра. Я попробовал эти коды. Я не знаю, есть ли лучший способ. Я надеюсь на помощь

Parallel.For(0, 10,new ParallelOptions {MaxDegreeOfParallelism=10 } ,i =>
{
        //send to check if open port on any ip
});

Или альтернативно:

Thread[] threads = new Thread[10];
for (int i = 0; i < 10; i++)
{
    threads[i] = new Thread(() => 
    {
        //send to check if open port on any ip
    });
}

Или альтернативно:

Task[] tasks= new Task[10];
for (int i = 0; i < 10; i++)
{
    tasks[i] = new Task(() => 
    {
        //send to check if open port on any ip
    });
}

1 Ответ

0 голосов
/ 16 апреля 2020

Parallel.For, как правило, лучше всего подходит для go.

Следует помнить, что вы (как правило) не знаете, сколько ядер у вас на целевой машине (если вы не пишете для одной очень конкретной c цели). Таким образом, любые предположения о степени распараллеливания сомнительны. Даже если вы знаете, сколько у вас ядер, вы не знаете, насколько они заняты другими вещами.

Система времени выполнения знает все эти вещи и лучше способна оптимизировать, чем вы, как программист.

Таким образом, даже с Parallel.For обычно нет необходимости указывать степень распараллеливания.

Использование Thread напрямую - плохая идея. Если вы попросите Thread, вы получите его, даже если ОС не хватает их, и это может замедлить процесс.

Если вы используете Task, система может отключиться давая вам актуальную ветку, если ее не хватает. Таким образом, использование Task s оставляет системе возможность выполнить некоторую оптимизацию, но Parallel.For все еще проще.

...