.Net: concatenazione di stringhe e prestazioni



Talvolta può capitare di dover realizzare, all'interno di una applicazione scritta utilizzando il framework .NET, numerose concatenazioni di stringhe.

Leggendo un trafiletto su IoProgrammo di questo mese ho avuto il 'la' per questa breve riflessione, che ha trovato riscontro anche in questo articolo su DotNetSide.
Prendiamo ad esempio questo breve listato:
1 string myString = string.Empty;
2
for (int i = 0; i < 10000; i++) {
3 myString += i.ToString();
4 }

La contenazione della stringa viene ripetuta per 10000 volte utilizzando il semplice operatore "+".
Le prestazioni sono estremamente basse: come si può leggere nell'articolo, questo breve listato viene eseguito in più di mezzo secondo (un'infinità!).

Analizziamo ora quest'altro frammento di codice:
1 StringBuilder sb = new StringBuilder();
2
for (int i = 0; i < 10000; i++) {
3 sb.Append(i.ToString());
4 }

In questo caso, al posto del semplice oggetto string viene utilizzata la classe StringBuilder.
Si tratta di uno oggetto sviluppato appositamente per la concatenazione delle stringhe; da MSDN:
Questa classe rappresenta un oggetto simile a una stringa il cui valore è una sequenza mutabile di caratteri. Il valore viene considerato mutabile perché può essere modificato dopo essere stato creato aggiungendo, rimuovendo, sostituendo o inserendo dei caratteri

Qual'è la differenza, in definitiva?
utilizzando una normale stringa in accoppiata con l'operatore "+", ogni qualvolta viene effettuata una concatenazione viene allocato in memoria uno spazio pari alla somma dei componenti che vengono concatenati, spazio nel quale viene poi effettuata la 'somma' dei due componenti.
A ogni ciclo viene quindi creata una nuova stringa destinata poi a generare nuovo lavoro per il Garbage Collector, incaricato di 'smaltirla'.

L'oggetto StringBuilder contiene invece un vettore di caratteri e, a ogni chiamata del metodo Append() vengono concatenati nuovi elementi senza creare inutilmente nuovi oggetti.

In questo modo lo stesso ciclo di 10000 iterazioni viene eseguito quasi 50 volte piu' velocemente.

Published: September 18 2007

  • category: