AGGIORNAMENTO: Ho usato il threading per suddividere il loop nella quantità di kernel (8 nel mio caso) e il ciclo completo è andato avanti in meno di 1 secondo. Quindi il problema non è che l'Operazione non è più veloce con il threading. Perché Parralel Extension ha fallito in questo caso?Parallelo.Più veloce/lento come normale PerOne
Ciao a tutti. Voglio convertire il mio ForEach con Parrallel.Foreach. Il problema è che la parralelizzazione non ha praticamente alcun vantaggio per me.
originale:
foreach (Entities.Buchung buchung in buchungen) {
Int32 categoryID = manager.GetCategoryID(new Regelengine.Booking(buchung)); // Average 4ms
buchung.Category = categoryID.ToString();
}
parallele:
System.Threading.Tasks.Parallel.ForEach(buchungen, buchung => {
Int32 categoryID = manager.GetCategoryID(new Regelengine.Booking(buchung));
buchung.Category = categoryID.ToString();
});
Risultati:
---------------------------
Stopwatched Results for 1550 entries in the List:
---------------------------
Parallel.Foreach 00:00:07.6599066
Average Foreach: 00:00:07.9791303
Forse il problema è che l'azione reale nel circuito è così breve? Ma nessuno può dirmi che parallelizzare le operazioni 1550 su un Intel I7 non salverà in alcun momento.
Probabilmente c'è un blocco in quella cosa di "Regelengine". – leppie
La domanda è: il metodo all'interno dell'istruzione trae profitto dal parallelismo? La prossima cosa che non so è cosa fa GetCategoryID. Esiste una chiamata al database che potrebbe essere il collo di bottiglia e impedire al codice di utilizzare il multithreading. – sprinter252
Cosa succede nel metodo 'manager.GetCategoryID'? Cosa succede nel ctor 'new Regelengine.Booking'? – AakashM