4

Jun

Query LINQ compilate = super velocità

Ciao a tutti

 

Per chi interessato a sfruttare al massimo le proprie risorse, c’è un’interessante funzionalità messa a disposizione da LINQ, le CompiledQuery.

Letteralmente query compilate in LINQ che permettono di accedere ai propri dati con maggiore velocità.

Vediamo un esempio di applicazione console:

 

[code language=”csharp”]

static void Main(string[] args)
{
    var s = new Stopwatch();

    Console.WriteLine("LINQ normale");
    for (int i = 0; i < 10; i++)
    {
        s.Restart();
        using (var context = new TestDBEntities())
        {
            var persons = from p in context.PersonDetails
                          select p.Name;

            var personsexecuted = persons.ToList();
        }
        s.Stop();
        Console.WriteLine("{0:N0} ms", s.ElapsedMilliseconds);
    }

    Console.WriteLine("LINQ CompiledQuery");
    for (int i = 0; i < 10; i++)
    {
        s.Restart();
        using (var context = new TestDBEntities())
        {
            var personsexecuted = getPersonNameCompiledQuery(context).ToList();
        }
        s.Stop();
        Console.WriteLine("{0:N0} ms", s.ElapsedMilliseconds);
    }

    Console.ReadLine();
}

static readonly Func> getPersonNameCompiledQuery =
    CompiledQuery.Compile>(context =>
        from p in context.PersonDetails
        select p.Name
        );

[/code]

 

In questo codice abbiamo utilizzato una compiledquery che sebbene sembri brutta da scrivere Winking smile in realtà è semplice. Analizziamone il codice:

creo un delegate statico che setto un’unica volta con la mia query. questo delegate generico (il Func) accetta un context come parametro e ritorna il necessario (in questo caso una query di string).

Al suo interno uso la classe CompiledQuery che staticamente mi compila il mio pezzettino di LINQ.

 

Risultato:

Sul mio PC, andando su di una tabella con una 20ntina di righe, ho questi risutati:

LINQ normale
800 ms
5 ms
40 ms
2 ms
3 ms
2 ms
2 ms
2 ms
2 ms
2 ms
LINQ CompiledQuery
4 ms
1 ms
1 ms
1 ms
0 ms
0 ms
0 ms
1 ms
0 ms
0 ms

 

Come potete notare, LINQ2Entities viene cachato comunque da EF, ma in ogni caso la sua esecuzione ha molte performance in meno se confrontato con le CompiledQuery

 

divertitevi a querare Smile

by Antonio Esposito on 6/4/2011