2010-05-23 5 views
16

Ho letto che PLinq utilizzerà automaticamente Linq non parallelo se trova che PLinq sia più costoso. Quindi ho capito perché non usare PLinq per tutto (quando possibile) e lasciare che il runtime decida quale usare.Va bene provare a utilizzare Plinq in tutte le query di Linq?

Le app saranno distribuite su server multicore e sto bene a sviluppare un po 'più di codice per gestire il parallelismo.

Quali sono le insidie ​​nell'usare plinq come impostazione predefinita?

risposta

9

Una caduta in fossa si perde la capacità di sfruttare l'ordine nei set.

Prendere il seguente codice:

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

Non si può contare sui risultati arrivando al fine per cui il risultato potrebbe essere qualsiasi permutazioni del set. Questa è una delle più grandi insidie, nel senso che se si hanno a che fare con dati ordinati, si potrebbero perdere i benefici in termini di prestazioni dovuti al costo dell'ordinamento.

Un altro problema è che si perde la possibilità di rilevare le eccezioni note. Quindi non ho potuto rilevare un'eccezione del puntatore nullo (non dicendo che dovresti mai farlo) o persino prendere un FormatException.

Ci sono un sacco di ragioni perché non si dovrebbe sempre usare Plinq in tutti i casi, e ne evidenzierò solo uno in più. Non leggere troppo in "uso automatico di Linq non parallelo", può gestire solo i casi di barriera in cui la query è semplice o sarebbe troppo complessa per essere eseguita in parallelo.

Ricorda sempre che più usi PLINQ più risorse consumerai sul server, che stanno prendendo il via da altri thread in esecuzione.

Risorse:

MSDN PLNQ white paper

Paul Kimmel on PLINQ

+2

Per garantito che ordinate può solo AsOrdered() se è, ovviamente, necessario misurare per scoprire se si guadagna nulla nel vostro algoritmo dal momento che questo non aggiungere spese generali. Per quanto riguarda le eccezioni, si otterrà un AggregateException se qualcosa si verifica nell'esecuzione parallelizzata da cui è possibile ottenere le singole eccezioni avvenute tramite la proprietà InnerException * s *. Come con ogni tecnologia, l'unico modo per sapere se ne trarrà beneficio consiste nel misurare effettivamente l'utilizzo di set di dati rappresentativi di ciò che elaborerai nel mondo reale. –

Problemi correlati