2010-05-23 3 views
16

Я читал, что PLinq будет автоматически использовать не параллельный Linq, если он найдет PLinq более дорогостоящим. Поэтому я подумал, почему бы не использовать PLinq для всего (когда это возможно) и позволить runtime решить, какой из них использовать.Можно ли использовать Plinq во всех запросах Linq?

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

Каковы подводные камни использования plinq по умолчанию?

ответ

9

Одно падение ямы - вы теряете возможность использовать заказы в наборах.

Возьмем следующий код:

var results = new int { 0 ,1 ,2 ,3 }; 
var doSomethingSpecial = (from r in results.AsParallel() select r/2).ToArray(); 

Вы не можете рассчитывать на результаты приходят в порядке, в результате может быть любые перестановки множества. Это одна из самых больших ошибок, в том смысле, что если вы имеете дело с упорядоченными данными, вы можете потерять преимущества производительности из-за стоимости сортировки.

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

Существует множество причин, почему вы не всегда должны использовать Plinq во всех случаях, и я выделил еще один. Не читайте также «автоматическое использование не параллельного Linq», он может обрабатывать только барьерные случаи, когда запрос является простым, или будет слишком сложным для параллельной работы.

Всегда помните, что чем больше польза PLINQ, тем больше ресурсов вы будете потреблять на сервере, которые убираются из других работающих потоков.

Ресурсы:

MSDN PLNQ white paper

Paul Kimmel on PLINQ

+2

Для гарантированного заказа вы можете просто AsOrdered(), хотя вы, очевидно, нужно измерить, чтобы узнать, если вы получаете что-нибудь в вашем алгоритме, так как это делает добавить накладные расходы. Что касается исключений, вы получите исключение AggregateException, если что-то происходит в параллельном исполнении, из которого вы можете получить отдельные исключения, которые произошли с помощью свойства InnerException * s *. Как и в случае с любой технологией, единственный способ узнать, принесет ли она вам пользу, - это на самом деле измерить, используя наборы данных, представляющие то, что вы будете обрабатывать в реальном мире. –

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