Domanda

Edit2:
Dopo aver finalmente potuto profilare i due l'uno contro l'altro, sembra che nella mia situazione .AsQueryable () sia leggermente più veloce di Expression.Compile ().

Domanda originale:
Ho implementato una cache di alcune tabelle di database (come Elenco < T > ) che devo interrogare con lo stesso espressione < Func < T, bool > > come ho verrebbe utilizzato per le query sulla Tabella < T > stessa.

Qual è il modo più veloce / migliore di questi:

List<T>.AsQueryable().FirstOrDefault(Expression<Func<T, bool>>)

o

List<T>.FirstOrDefault(Expression<Func<T, bool>>.Compile())

Modifica: Modificato Where to FirstOrDefault, poiché questo è il metodo che sto usando. Immagino di essere un po 'stanco quando ho scritto la domanda. FirstOrDefault esaminerà ogni oggetto una volta come Where, o si fermerà effettivamente al primo colpo (se presente)? ??

È stato utile?

Soluzione

Come sempre, il modo migliore per determinare cosa è più veloce è provarlo, tuttavia:

Filtraggio di un elenco < > utilizzando un semplice Where si tradurrà sempre in ogni esame di una volta. Senza ulteriori ipotesi come il fatto che la tua lista sia ordinata in un ordine specifico, non c'è davvero nessun altro modo, il che significa che le due versioni fornite daranno le stesse identiche valutazioni della tua espressione.

Se utilizzerai più volte la stessa espressione, potresti trarre vantaggio dalla compilazione e dalla memorizzazione nella cache del delegato, anche se i dati dovrebbero essere piccoli e l'espressione complessa per fare la differenza.

Modifica: passare attraverso le query potrebbe possibilmente essere più veloce per le espressioni che in realtà non dipendono da alcun input, come () = > falso.

Altri suggerimenti

Dipende da quante operazioni eseguirai e dall'intensità del processore dell'esecuzione dell'espressione.

Puoi facilmente testarlo usando un cronometro o qualche altro componente diagnostico.

Perché secondo indovinarlo? Profilalo con i tuoi dati e vedi quale funziona meglio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top