posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

Performance di Hashtable, Collection e Dictionary

Che le performance di Hashtable/Dictionary sulla ricerca di item sia superiore è cosa stranota e messa in grande evidenza su MSDN.

Spesso però sui newsgroup leggo di persone che non usano il contenitore giusto e quindi ho deciso di mettere giù qualche numero per le operazioni più frequenti: Add e Contains. La prova è molto spartana ed è giusto per vedere l'ordine di grandezza.

Hashset<> è una nuova classe del Framework 3.5 studiata per Linq e mediamente più veloce del Dictionary.

In tutto questo la Hashtable è comunque vincente e il perché è semplice: Hashtable è thread-safe per multiple-reader e un writer. In applicazioni multithreading più di una volta l'ho usata per questo motivo e consente di evitare totalmente una montagna di lock. Se esiste la possibilità di avere più di un writer, è sufficiente mettere i lock solo sulle operazioni di scrittura e questo semplifica drasticamente il codice.

List<> è comunque una scelta valida per l'uso più tipico delle collection, l'accesso indicizzato. Non è quindi per nulla bocciata.

Una delle prossime modifiche alla mia RafCollection sarà proprio quella di costruire gli indici con dei Dictionary da usarsi con la AddIndex/RemoveIndex di IBindingList.

1 Milione di Add:

Collection_Perf_Add

1 Milione di Add + 1 Milione di Contains su un elemento non in lista

Collection_Perf_Add_Contains

Le Contains su List<T> sono così lente che ho dovuto interrompere l'elaborazione dopo diverse decine di minuti.

Adesso pensiamo di aggiungere al nostro business layer una Hashtable o Dictionary condiviso tra tutti gli utenti che mantenga in memoria gli indici dei dati delle tabelle più critiche sul DB. Voi mi direte che sto duplicando il lavoro che fa già egregiamente il DB (ed è vero), ma io rispondo che in certi casi può alleggerire molto significativamente il carico, permettendo forte scalabilità. Se teniamo conto che la Hashtable può essere presente su tutti gli application server mentre di DB ce n'è uno solo ...

Print | posted on giovedì 20 dicembre 2007 12:58 |

Feedback

Gravatar

# re: Performance di Hashtable, Collection e Dictionary

Si, è una delle cose che ho in mente.
Sto valutando la possibilità di creare un Linq provider ma il lavoro è tanto e lungo.
La vera sfida con Linq diventa l'implementazione efficiente della ricerca, altrimenti se mi limito a scorrere le liste con IEnumerable le performance se ne vanno.
20/12/2007 14:28 | Raffaele Rialdi
Gravatar

# re: Performance di Hashtable, Collection e Dictionary

Attendo fiducioso !
20/12/2007 16:33 | Stefano Paparesta
Gravatar

# re: Performance di Hashtable, Collection e Dictionary

Ho scritto che era una misurazione molto spartana. Mi interessa vedere solo l'ordine di grandezza, altrimenti devi poi vedere il codice IL effettivamente prodotto e farlo girare su un PC totalmente scarico di servizi e applicazioni per poter eseguire un test che possa essere chiamato accurato.

Sui DB conduco lotte continue. Io riconosco gli enormi pregi dell'engine dei DB, ma ci sono persone si ostinano a usarli come se fossimo ancora negli anni settanta.
Grazie e ciao!
21/12/2007 15:24 | Raffaele Rialdi
Gravatar

# re: Performance di Hashtable, Collection e Dictionary

Ciao Sergio, il vantaggio dell'hashtable è quello di essere thread-safe! Essere thread safe ha un costo non indifferente e qui lo si vede chiaramente. Ma se hai bisogno della thread-safety hashtable è impagabile perché è safe per multiple reader e un writer, cosa estremamente comoda.
Se invece la thread safety non ti interessa, allora Hashset e Dictionary sono più performanti.
La list come sempre è scarsissima di performance nelle Contains.
Ognuna di quelle classi ha il suo uso ottimale, lo scopo del post è quello di accendere dubbi affinché ognuno ragioni sulla scelta più opportuna a seconda delle proprie necessità.
24/12/2007 00:12 | Raffaele Rialdi
Gravatar

# re: Performance di Hashtable, Collection e Dictionary

Prego! :)
24/12/2007 15:43 | Raffaele Rialdi
Gravatar

# re: Performance di Hashtable, Collection e Dictionary

Ciao Pierre,
non capisco in cosa dissenti :)
Che il problema sia più vasto concordo, infatti la mia RafCollection su Codeplex affronta tutta un'altra serie di problematiche relative alle collection evolute.
Questo post serviva solo ad evidenziare le differenze più macroscopiche (l'ordine di grandezza dal punto di vista delle performance) su queste classi che sono tipicamente le più usate.
L'enumerazione piatta (IEnumerable) è la meno significativa e non l'ho presa in considerazione in quanto scorrere gli elementi è performante sia sulle liked list che sulle collection basate su array come List<T>.
L'ordinamento credo che faccia parte di quelle feature avanzate che questo post non indirizza (e che ho indirizzato invece in RafCollection perché solleva una serie di problematiche a catena come l'uso di IComparer oppure Reflection).
Ciao!
31/12/2007 18:09 | Raffaele Rialdi
Gravatar

# re: Performance di Hashtable, Collection e Dictionary

Post come sempre molto interessante, avrebbe senso allora confrontare il tutto anche con le powercollection (http://www.wintellect.com/PowerCollections.aspx) di Richter.
Cmq è vero che molto spesso le persone non si pongono il problema di quale struttura dati utilizzare e va a finire che si utilizza sempre la stessa. Sebbene l'ottimizzazione sia una cosa da fare solo dopo appositi test, conoscere pregi/difetti delle principali strutture dati è indubbiamente necessario per fare fin dall'inizio le scelte più intelligenti.

Alk.
02/01/2008 11:20 | Gian Maria
Gravatar

# re: Performance di Hashtable, Collection e Dictionary

@Antonio. Si, certo itera tutti gli elementi e non potrebbe fare diversamente. Le hashtable si basano sull'intero generato dalla procedura di hash e quindi la loro comparazione durante l'iterazione è decisamente più performante.
Vera anche la seconda. Fai sempre riferimento a msdn per sapere cos'è e cosa non è thread-safe. In ogni classe è ben specificato se è thread-safe.
Ciao
22/01/2008 16:57 | Raffaele Rialdi
Gravatar

#  Il fascino di RAF e Lorenzo | TekkaZot

Il fascino di RAF e Lorenzo | TekkaZot
07/07/2011 23:02 | Pingback/TrackBack
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET