2013-06-19 2 views
4

PLINQ автоматически распараллеливает локальные запросы LINQ. PLINQ имеет то преимущество, что он прост в использовании, поскольку он разгружает нагрузку как рабочего разбиения, так и сопоставления результатов в Framework.Который должен использовать: LINQ или PLINQ

В общем программировании, который должен я использовать пользователь простой LINQ или PLINQ?

Является ли PLINQ лучше для пользователей слишком большими данными? или также лучше для небольших данных?

+0

Возможно, вы нашли эту ветку, но в случае, если нет, я рекомендую вам прочитать ответ http://stackoverflow.com/ a/8547903/896258 – meorfi

+0

Я бы рекомендовал также эту ссылку. (Это очень короткий пример). Это зависит не от того, сколько данных у вас есть, но сколько времени займет другие потоки для разрешения основного запроса linq. http://www.codeproject.com/Tips/374420/When-to-use-PLINQ-vs-LINQ – meorfi

ответ

5

Учитывая, что AsParallel прозрачно параллелизует LINQ запросы, возникает вопрос: «Почему не Microsoft просто распараллелить стандартные операторы запросов и сделать PLINQ по умолчанию?»

Есть целый ряд причин для отказа в подход. Во-первых, для того, чтобы PLINQ был полезен, должен быть разумный объем вычислительно-интенсивной работы, чтобы он работал с рабочими потоками. Большинство запросов LINQ to Objects выполняются очень быстро, и не только необходимость в распараллеливании не нужна, но накладные расходы на разбиение на разделы, сортировку и координацию дополнительных потоков могут фактически замедлить работу.

Дополнительно:

Выход из PLINQ запроса (по умолчанию) может отличаться от запроса LINQ относительно элемента упорядочения.

Следующие операторы запроса предотвратить запрос из распараллеливается, если исходные элементы не находятся в исходном положении индексации:

Примите, TakeWhile, Скип, и SkipWhile Индексированные версии Select, SelectMany и ElementAt Большинство операторов запроса меняют положение индексирования элементов (включая те, которые удаляют элементы, например Where). Это означает, что если вы хотите использовать предыдущие операторы, они, как правило, должны быть в начале запроса.

Следующие операторы запросов параллелизуемы, но использовать дорогую стратегию секционирования, что иногда может быть медленнее, чем последовательная обработка:

Join, GroupBy, GroupJoin, Distinct, Union, Intersect, и кроме посеянных перегрузок агрегированного оператора в их стандартных воплощениях не распараллеливаются - PLINQ предоставляет специальные перегрузки для решения этой проблемы.

Когда использовать PLINQ

Заманчиво искать существующие приложения для LINQ запросов и эксперимента с распараллеливания их. Это обычно непродуктивно, потому что большинство проблем, для которых LINQ, очевидно, лучшее решение, как правило, выполняются очень быстро и поэтому не приносят пользы от распараллеливания. Лучший подход заключается в том, чтобы найти узкое место для процессора и затем рассмотреть: «Может ли это быть выражено как запрос LINQ?» (Другим побочным эффектом такой реструктуризации является то, что LINQ обычно делает код более компактным и читаемым.)

PLINQ хорошо подходит для смущающих параллельных проблем. Он также хорошо работает для структурированных задач блокировки, таких как одновременное вызов нескольких веб-служб (см. «Блокирование вызовов» или «Функции ввода-вывода»).

PLINQ может быть плохим выбором для обработки изображений, поскольку сбор миллионов пикселей в последовательности вывода создает узкое место. Вместо этого лучше писать пиксели непосредственно в массив или неуправляемый блок памяти и использовать параллельный класс или параллелизм задач для управления многопоточным процессом. (Возможно, однако, чтобы победить сопоставление результатов с использованием ForAll.Это имеет смысл, если алгоритм обработки изображений естественным образом поддается LINQ.)

+3

Скопировано: http://www.albahari.com/threading/part5.aspx#_PLINQ_Limitations Хороший старый плагизм от Waheed, Не один, он сделал то же самое здесь: http://stackoverflow.com/questions/8540646/difference-linq-and-plinq – user603563

Смежные вопросы