2013-12-17 13 views
7

Recentemente ho fatto un paio di misure su Linq e Plinq. Non riesco a vedere in quale situazione abbia un reale vantaggio significativo di Plinq.Ha qualche vantaggio reale su PLINQ?

ho trovato molti esempi come:

Enumerable.Range(0, 10000).AsParallel().ForAll(_ => Thread.Sleep(50000)); 

Questo è ad esempio del tutto inutile, perché può essere parallized con il grado di 10000 e sì allora sarà più veloce 10000 volte, ma è raro in un business applicazione per eseguire il ciclo 10000 volte e creare "lavori IO".

Se qualcuno può citare un esempio, si prega di postarlo.

Plinq è disponibile solo per Linq to Objects e Linq to XML. Non consigliato di utilizzarlo in un'applicazione che gira su webserver (ha la propria gestione dei thread). Quindi le nostre opportunità sono ridotte ad applicazioni desktop che hanno più core.

Di solito scrivo query in linq che vengono eseguite sequenzialmente in frazioni di secondo. Se lo faccio in parallelo e funzionerà in parallelo, allora sarà più veloce, ma a chi importa? Penso che sia ancora abbastanza veloce. L'utente finale non vedrà alcuna differenza.

Posso immaginare un esempio quando qualcuno riceve tutti i dati dal DB e esegue una query in memoria. Allora forse è utile, ma è un progetto sbagliato.

TPL è una buona roba per la programmazione asyncron, ma non sono ancora sicuro che Plinq sia uno strumento utile.

Qualcuno ha un'esperienza positiva a riguardo?

+0

* "Non si supponga che Parallel sia sempre più veloce" * ... È necessario esaminare [Potential Pitfalls with PLINQ] (http://msdn.microsoft.com/en-us/library/dd997403%28v= vs.110% 29.aspx) !! –

+0

Grazie, ho già esaminato :) – speti43

+0

Non c'è bisogno di aggiustare ciò che non è rotto. PLINQ potrebbe avere senso per i dati di grandi dimensioni su computer multi-core. –

risposta

7

Lo scenario chiave in cui si ottiene beneficio dal PLINQ è qualcosa di simile:

int[] src = Enumerable.Range(0, 100).ToArray(); 
var query = src.AsParallel() 
       .Select(x => ExpensiveFunc(x)); 

E non ottenere benefici reali.

Vedere l'articolo here per ulteriori dettagli su quando è utile.

Ho visto dei vantaggi quando, ad esempio, sto cercando di valutare un costoso metodo numerico iterativo per calcolare una serie di valori Y da un insieme di punti X per la rappresentazione grafica.

+0

Hai mai scritto un codice come questo? Comprendo teoricamente il vantaggio di PLINQ, ma non riesco a immaginare l'implementazione di ExpensiveFunc, ritengo comunque che questo sia un progetto sbagliato. Cosa dovrebbe esserci in ExpensiveFunc che è significativamente più veloce in parallelo? – speti43

+3

Sì, ho.Stavo usando una macchina a 24 core e stavo cercando di calcolare 1000 punti dati, ognuno dei quali impiega circa 200 ms di thrash numerico per calcolare individualmente. Il tempo di elaborazione è sceso da circa 3 minuti a meno di 15 secondi, e la mia CPU è stata ottimamente estesa alla maggior parte dei core. PLINQ non è una soluzione magica, ma ci sono situazioni in cui offre reali vantaggi. (Nel mio caso, il codice all'interno di ExpensiveFunc stava facendo una moltiplicazione di matrice iterativa per calcolare tensioni di punti discrete per una simulazione di dispositivi a semiconduttore) – Baldrick

+0

Sì, questo ha senso. Grazie! – speti43

0

provare a farlo su una molto più grande pezzo di dati o di un compito più complesso

_objects.AsParallel().Select(ConvertObject); 

bool ConvertObject(object item) 
{ 
//some long running task 
} 

io uso PLINQ per un certo numero di ETL di magazzino di dati in quanto può essere veloce per scrivere e facile da mantenere (a costo forse delle prestazioni complessive)

Suppongo che il business case qui sia la velocità di sviluppo.