PLINQ (parallel linq) permette la gestione di operazioni su insiemi di oggetti su più core con un notevole vantaggio nei tempi di esecuzione , qui un introduzione alla tecnologia PLinq , ho fatto qualche prova ed i risultati portano a credere che il test stesso andrebbe condotto in altro modo , ho caricato 1000000 di record nella tabella Products e poi ho fatto una select sulle righe prima con Linq "semplice" e poi con ParallelLinq .La macchina utilizzata ha un processore i7-11370H , 4 cpu cores ed 8 "cpu logiche" ,disco ssd .
Ho aggiunto 1 milione di record nella tabella Products di un db Northwind , ho creato un progetto Asp .net Mvc , ed ho utilizzato la possibilità "Database First" (con il comando Scaffold-DbContext) per creare nel progetto Asp .net la struttura di oggetti che rispecchi quella tabellare di Northwind per poter utilizzare Linq e ParallelLinq .Segue lo snippet per caricare la tabella :
lo snippet può essere chiamato in un app console :
{
static void Main(string[] args)
{
Console.WriteLine("inizio caricamento");
Util u=new Util();
u.CaricaDB();
Console.WriteLine("fine caricamento");
}
}
a questo punto è possibile provare le query sulle collezioni di oggetti , creiamo un controller Products ed aggiungiamo un metodo (un action) di test ,di nome Test ( :-) )
{
DateTime dt1 = DateTime.Now;
//var list = from p in _context.Products.AsParallel().WithDegreeOfParallelism(2) where p.ProductName.Contains("%0%") select p;
var list = from p in _context.Products.AsParallel() where p.ProductName.Contains("%0%") select p;
//var list = from p in _context.Products where p.ProductName.Contains("%0%") select p;
DateTime dt2 = DateTime.Now;
TimeSpan span = dt2.Subtract(dt1);
ViewData["Milliseconds"] = span.TotalMilliseconds;
return View("Test");
}
@{
ViewData["Title"] = "Test";
}
<h1>Test</h1>
Milliseconds: @ViewData["Milliseconds"];
Plinq sembrerebbe centinaia di volte più veloce , evidentemente qualcosa non và nei test... , se avete suggerimenti , critiche ,segnalazione di errori, potete scrivere a gianmarco.castagna@gmail.com