Передача в списках в Parallel.ForEach - PullRequest
0 голосов
/ 18 февраля 2019

Это первый раз, когда я пытаюсь использовать цикл «Parallel.ForEach», чтобы посмотреть, смогу ли я улучшить производительность, используя много ядер в системе.Я попытался взглянуть на MSDN и другие примеры, но не могу найти способ передачи в 3 списка, как показано ниже.

Как можно заменить этот цикл на цикл Parallel.ForEach?Я думаю, что ищу основы того, как пройти во все эти 3 списка, чтобы я мог работать с ними в цикле Parallel.ForEach?

Спасибо!

        List<double> nums = new List<double> { 0.0005, 0.00035, 0.00205 };
        List<double> list1 = new List<double>();
        List<double> list2 = new List<double>();
        List<double> list3 = new List<double>(); Random random = new Random(); double calc1 = 0;
        List<double> resultLIST = new List<double>();
        for (int i = 0; i < 4000000; i++)
        {
            list1.Add(nums[random.Next(0, 7)]);
            list2.Add(nums[random.Next(0, 7)]);
            list3.Add(nums[random.Next(0, 7)]);
        }

        //How can the below loop be replaced with a: Parallel.ForEach loop?
        for (int i = 0; i < list1.Count; i++)
        {
            calc1 = list1[i] * list2[i] * list3[i];
            resultLIST.Add(calc1);
        }

        //Now sort the list 
        resultLIST.Sort();

        //Here I will write "resultLIST" to a .txt file

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Вы используете Parallel.Foreach, когда операции над каждым списком могут выполняться независимо параллельно.В вашем случае вы не можете.Также помните, что использование Parallel.Foreach или AsParallel для таких тривиальных операций, как * или +, может привести к снижению производительности из-за увеличения накладных расходов.

В вашем случае наилучшим подходом будет разделение всех трех списков по 1000000 элементов в каждом.Добавьте их в массив массива и вызовите для них Parallel.Foreach.Таким образом, у вас будет 4 потока, выполняющих по 1000000 операций каждый, и если на вашей машине 4 ядра, они могут работать независимо на каждом ядре.

0 голосов
/ 18 февраля 2019

Лично я бы использовал LINQ с AsParallel:

var result = Enumerable.Range(0, list1.Count)
    .AsParallel()
    .Select(index => list1[index] + list2[index] + list3[index])
    .OrderBy(v => v)
    .ToList();

Обратите внимание, что list1, list2 и list3 не должны изменяться во время этого вычисления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...