Можно ли использовать Plinq во всех запросах Linq? - PullRequest
16 голосов
/ 24 мая 2010

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

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

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

1 Ответ

9 голосов
/ 24 мая 2010

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

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

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

Пол Киммел на PLINQ

...