2010-05-23 10 views
16

Leo que PLinq usará automáticamente Linq no paralelo si encuentra que PLinq es más caro. Entonces, pensé: ¿por qué no usar PLinq para todo (cuando sea posible) y dejar que el tiempo de ejecución decida cuál usar?¿Está bien intentar usar Plinq en todas las consultas de Linq?

Las aplicaciones se implementarán en servidores multinúcleo y estoy de acuerdo en desarrollar un poco más de código para lidiar con el paralelismo.

¿Cuáles son los inconvenientes de usar plinq como valor predeterminado?

Respuesta

9

Una caída en el pozo es la pérdida de la capacidad de aprovechar el orden en los conjuntos.

tomar el código siguiente:

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

No se puede contar con los resultados vienen con el fin lo que el resultado podría ser cualquier permutaciones del conjunto. Este es uno de los mayores escollos, en el sentido de que si está tratando con datos ordenados, entonces podría estar perdiendo los beneficios de rendimiento debido al costo de la clasificación.

Otro problema es que pierde la capacidad de detectar excepciones conocidas. Así que no pude capturar una excepción de puntero nulo (sin decir que alguna vez debería hacer eso) o incluso atrapar una FormatException.

Hay un montón de razones por las que no siempre se debe usar Plinq en todos los casos, y destacaré solo una más. No lea demasiado en el "uso automático de Linq no paralelo", solo puede manejar los casos de barrera donde la consulta es simple, o sería demasiado compleja para ejecutarse en paralelo.

Siempre tenga en cuenta que cuanto más use PLINQ más recursos va a consumir en el servidor, lo que le restará a otros subprocesos en ejecución.

Recursos:

MSDN PLNQ white paper

Paul Kimmel on PLINQ

+2

Para garantizar que el pedido puede simplemente AsOrdered(), aunque es obvio que hay que medir para averiguar si se gana nada en su algoritmo ya que esto le añade gastos generales. En cuanto a las excepciones, obtendrá una AggregateException si ocurre algo en la ejecución paralelizada desde la cual puede obtener las excepciones individuales que ocurrieron a través de la propiedad InnerException * s *. Como con cada tecnología, la única forma de saber si te beneficiará es midiendo el uso de conjuntos de datos representativos de lo que procesarás en el mundo real. –

Cuestiones relacionadas