Alkampfer's Place

Il blog di Gian Maria Ricci
posts - 659, comments - 871, trackbacks - 80

My Links

News

Gian Maria Ricci Mvp Logo CCSVI in Multiple Sclerosis

English Blog

Tag Cloud

Article Categories

Archives

Post Categories

Image Galleries

I miei siti

Siti utili

Tanto per parlare di collection

Ho una applicazione che ad un certo punto analizza una serie di blocchi di testo per trovare dei pattern e deve restituire una lista univoca di stringhe che matchano. La prima implementazione è stata di fare una List<String> ed ad ogni match fare un List.Contains ed aggiungere solo quando  la stringa non compare già.

Faccio i miei bei unit test ma quando metto in produzione mi accorgo che i dati su cui si lavora sono molto di più di quello che mi attendevo, io mi attendevo nell'ordine delle centinaia di match, mentre invece siamo nell'ordine delle decine di migliaia....su un caso reale ho circa 9 minuti di orologio per fare i match. Inizialmente ho pensato che con parti di testo cosi grandi fossero le regex a dare problemi poi ho usato le powercollection di ricther usando un OrderedSet<String>, il risultato è che il tempo decresce a circa 40 secondi.

Questo ci fa capire che la List<T> non è assolutamente performante quando si parla di fare contains su insiemi molto grandi di elementi, le Powercollection sono sempre una buona soluzione ad impatto praticamente zero.

alk.

Tags:

Print | posted on martedì 15 aprile 2008 18:46 | Filed Under [ .NET ]

Feedback

Gravatar

# re: Tanto per parlare di collection

L'impatto, IMHO, e' che il programmatore a cui somministri una cosa del genere si trova nella condizione di mai imparare cos'e un algoritmo, ma solo l'arte dell'assemblaggio. Ed e' solo uno di tanti esempi. Cioe', magari ne' l'uno ne' l'altro estremo, la produzione indubbiamente ha le sue esigenze, tuttavia l'impatto non mi sembra che sia a costo zero.

-LV
15/04/2008 19:11 | LudovicoVan
Gravatar

# re: Tanto per parlare di collection

Non lo devo somministrare a nessuno è codice che principalmente mantengo io ed un collega che sa esattamente di cosa si parla. In secondo luogo non penso che per fare un pezzo di codice che faccia quello che voglio sia necesario che un programmatore si impari come fare un albero binario di ricerca autobilanciato, il bello della programmazione ad oggetti è anche un elevato riutilizzo del codice ed evitare di reinventare la ruota.

Il motto del post è, attenzione quando si usano le collection, la LIst<T> non va bene da tutte le parti.

L'impatto è a costo zero perchè mi basta referenziare la dll poi invece di usare una List<String> uso una OrderedSet<String> che ha il contains etc etc e si comporta come una lista senza duplicati.

Alk.
15/04/2008 19:35 | Gian Maria
Gravatar

# re: Tanto per parlare di collection

Ok, adesso e' tutto chiaro. Grazie per la spiegazione.

-LV
15/04/2008 19:41 | LudovicoVan
Gravatar

# re: Tanto per parlare di collection

Infatti non ho problemi a dirti che per lo meno GUISA, cosi' com'e, e' un'esperienza che per me si chiude qui.

E' stato bello fin che e' durato.

Baci, abbracci, e un caloroso grazie a tutti.

Ciao.

-LV
15/04/2008 19:57 | LudovicoVan
Gravatar

# re: Tanto per parlare di collection

Non comprendo assolutamente le motivazioni del tuo commento :D. Non ricopro nessuna carica in guisa, sono un semplice frequentatore come te e quindi trovo che annunciare la tua uscita da GUISA nel mio blog sia per lo meno una cosa strana.

Detto cosi sembra che tu lasci per causa mia, anche in questo caso non ne capisco assolutamente il motivo, sarei contento che lo spiegassi perchè come Raffaeu anche io mi sono perso qualche cosa :D.

Alk.

15/04/2008 20:13 | Gian Maria
Gravatar

# re: Tanto per parlare di collection

Siete un muro di gomma. Avete gia' capito tutto, e io pure. Tempo di passare ad altri progetti.

Di nuovo, e' stato un piacere.

-LV
15/04/2008 20:19 | LudovicoVan
Gravatar

# re: Tanto per parlare di collection

Io per lo meno muro di gomma non mi ci sento :D, abbiamo idee differenti su come scrivere software, ma sul forum di guisa, almeno per mia sensazione, quello che ha toni non troppo gentili sei solitamente tu.

Non ti ho mai insultato, non ti ho mai trattato male, mentre i tuoi toni sono generalmente poco leggeri nei confronti degli altri (http://www.guisa.it/forums/thread/1833). Ma di nuovo, forse è una mia sensazione.

Continuo quindi a non capire perchè tu debba annunciare la tua uscita da GUISA nel mio blog, quasi come se io ti avessi fatto qualche torto, ho anche riletto gli ultimi post e non trovo spiegazione.

Ne prendo comunque atto, mi spiace perdere una delle poche persone che GUISA lo frequentava, in bocca al lupo per tutto, è stato un piacere anche per me.

Alk.
15/04/2008 20:45 | Alkampfer
Gravatar

# re: Tanto per parlare di collection

Take care mate, come dicono oltre-manica.

-LV
15/04/2008 20:48 | LudovicoVan
Gravatar

# re: Tanto per parlare di collection

Appena ho tempo contorllerò anche la C5, debbo dire che non la conoscevo.

alk.
15/04/2008 21:25 | Alkampfer
Gravatar

# re: Tanto per parlare di collection

Potresti usare una struttura basata su qualche algoritmo di hash. Ad esempio un Dictionary generic ha un metodo di Contains che lavora O(1) invece che O(n) di quello di List<T>.
... anche solo una "vecchia" Hashtable.
15/04/2008 21:33 | Fabrizio
Gravatar

# re: Tanto per parlare di collection

hai ragione, ho la semantica del SEt e non della lista, chiedo venia, è l'hash table ed il dictionary che ha la semantica chiave-valore, è chiaro che io psso mettere lo stesso valore sia nella chiave che nel valore, ma mi piace più usare un set che internamente usa l'hashing ma non ha la semantica chiave valore ed è un IENumerable<T>.

Alk.
17/04/2008 00:04 | Alkampfer
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET