c# linq .net-4.0 task-parallel-library plinq

c# - ¿Está bien intentar usar Plinq en todas las consultas de Linq?



.net-4.0 task-parallel-library (1)

Leí que PLinq usará automáticamente Linq no paralelo si encuentra que PLinq es más caro. Así que pensé entonces por qué no usar PLinq para todo (cuando sea posible) y dejar que el tiempo de ejecución decida cuál usar.

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

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


Una caída en boxes es que se pierde la capacidad de apalancar el pedido en conjuntos.

Toma el siguiente código:

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

No se puede contar con que los resultados vengan en orden, por lo que el resultado podría ser cualquier permutación 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 pierdes la habilidad de atrapar excepciones conocidas. Así que no pude captar una excepción de puntero nulo (sin decir que nunca debes hacer eso) o incluso atrapar una FormatException.

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

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

Recursos:

MSDN PLNQ white paper

Paul Kimmel en PLINQ