Alla ricerca in una collection

di Stefano Mostarda, in .NET,

La fase di ottimizzazione del codice, relativamene a performance e uso di risorse, è una parte, IMHO, noiosa e divertente allo stesso tempo. Noiosa perchè la fasi di rilevamento dati come profiling e measuring non sono le mie preferite, divertente perchè il tuning del codice che ne scaturisce insegna sempre qualcosa di nuovo. Questo perchè ci costringe ad uscire dai canoni di codice "ordinari". Oggi ho avuto un'altra dimostrazione di questo fatto.
Il tempo di esecuzione di un ciclo di ricerche all'interno di una collection tipizzata era troppo alto, questo perchè usavo il metodo Contains. Cercando meglio tra i metodi della classe Array, mi imbatto nel metodo BynarySearch. La differenza tra i 2 approcci è la modalità di ricerca. Mentre il primo metodo effettua una ricerca sequenziale, il secondo effettua una ricerca dicotomica. Ovviamente, il primo funziona in ogni caso mentre il secondo solo in caso di collection ordinate. Il problema nel mio caso non si è posto poichè la collection era caricata da DB, altrimenti avrei dovuto utilizzare il Sort ma con un degrado enorme.
Comunque per darvi un'idea della velocità che si ha usando il BynarySearch rispetto al Contains e all'IndexOf, ecco una tabella comparativa.

1000 elementi10000 elementi
Contains0.0164671.586318
IndexOf0.0143221.670793
BinarySearch0.0007580.011789

Da questa tabella si nota che più sono gli elementi, più le performance migliorano con il BinarySearch.

Forse ho scoperto l'acqua calda, in fondo ci vuole poco a capire che una lista ordinata è più veloce da cercare, ma questo tassello mi mancava proprio.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese