157 советов по улучшению программ на C# — предложение 84. Учебные заметки: использование PLINQ

искусственный интеллект

Microsoft расширила класс ParallelEnumerable специально для Linq (этот тип также находится в пространстве имен System.Linq), а предоставляемый им метод расширения позволяет Linq поддерживать параллельные вычисления, которые называются PLinq.

Традиционные вычисления Linq являются однопоточными, а PLinq — параллельными и многопоточными, например:

   class Program

    {

        static void Main(string[] args)

        {

            List<int> intList = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

            var query = from p in intList select p;

Console.WriteLine("Следующий вывод Linq:");

            foreach (int item in query)

            {

                Console.WriteLine(item.ToString());

            }

Console.WriteLine("Далее параллельный вывод PLinq:");

            var queryParallel = from p in intList.AsParallel() select p;

            foreach (int item in queryParallel)

            {

                Console.WriteLine(item.ToString());

            }

            Console.ReadKey();

        }

}

Вот вывод Linq:

0

1

2

3

4

5

6

7

8

9

Вот параллельный вывод PLinq:

0

1

9

2

4

6

8

3

5

7

Другой способ параллельного вывода:

   queryParallel.ForAll((item) => {

                Console.WriteLine(item.ToString());

            });

Использование ForAll игнорирует запрос AsOrdered запроса. пример:

Console.WriteLine("Далее параллельный последовательный вывод PLinq:");

            var queryParallel = from p in intList.AsParallel().AsOrdered() select p;

            foreach (int item in queryParallel)

            {

                Console.WriteLine(item.ToString());

            }

Console.WriteLine("Ниже приведены параллельные выходные данные PLinq ForAll:");

            queryParallel.ForAll((item) => {

                Console.WriteLine(item.ToString());

            });

Вот параллельный последовательный вывод PLinq:

0

1

2

3

4

5

6

7

8

9

Вот вывод параллельного ForAll PLinq:

9

2

3

8

4

5

6

7

0

1

Сортировка после параллельного запроса приведет к снижению производительности. Некоторые методы расширения сортируют элементы по умолчанию. К этим методам относятся OrderBy, OrderByDescending, ThenBy и ThenByDescending, а также некоторые методы запроса, такие как Take.