StringBuilder utilizza più memoria rispetto alla concatenazione di stringhe?

So che l’ovvio vantaggio in termini di prestazioni nell’uso di StringBuilder è in C #, ma quale è la differenza di memoria?

StringBuilder usa più memoria? e come nota a margine, in sostanza cosa fa il costruttore di stringhe in modo diverso che lo rende molto più veloce?

Risposta breve: StringBuilder è appropriato nei casi in cui si concatena un numero arbitrario di stringhe, che non si conosce in fase di compilazione.

Se si conoscono le stringhe che si stanno combinando in fase di compilazione, StringBuilder è fondamentalmente inutile in quanto non è necessario il suo ridimensionamento dinamico.

Esempio 1: vuoi combinare “cat”, “dog” e “mouse”. Questo è esattamente 11 caratteri. Potresti semplicemente allocare una matrice char[] di lunghezza 11 e riempirla con i caratteri di queste stringhe. Questo è essenzialmente ciò che string.Concat fa.

Esempio 2: si desidera unire un numero non specificato di stringhe fornite dall’utente in una singola stringa. Poiché la quantità di dati da concatenare è sconosciuta in anticipo, l’uso di un StringBuilder è appropriato in questo caso.

StringBuilder non è necessariamente più veloce. Come ricordo, se si concatenano meno di una dozzina di stringhe, la concatenazione delle stringhe (eiether tramite String.Concat o semplice str1 + str2) è effettivamente più veloce. Il motivo è che l’allocazione e l’inizializzazione di StringBuilder richiede in realtà tempo.

Il motivo per cui StringBuilder è più veloce è che crea un buffer interno a cui aggiunge stringhe. Se si concatenano 20 stringhe, StringBuilder aggiunge semplicemente uno dopo l’altro al proprio buffer e infine restituisce il risultato quando richiesto – tramite il suo metodo ToString (). (Sto assumendo che ci sia spazio sufficiente per il buffer, altrimenti StringBuilder si preoccupa di riallocare il buffer e ha l’euristica per aiutarlo a non riallocare troppe volte.) Se si stesse concatenando delle stringhe, ogni stringa concat assegnerebbe una nuova stringa di length (str1.Length + str2.Length) e copiare la prima e la seconda stringa in posizione. Ciò si traduce in un sacco di ricopiatura di stringhe.

 var result = str1 + str2 + str3 + ... + strN; 

Ciò richiederà allocazioni N-1 e operazioni di copia N-1. Questo può diventare molto costoso per N grande. Nota inoltre che stai copiando il contenuto di str1 N-1 volte. Una volta per ottenere il risultato di str1 + str2. Quindi di nuovo per ottenere il risultato di (str1 + str2) + str3. Con StringBuilder, ogni stringa viene copiata nel buffer interno una sola volta, assumendo che il buffer sia sufficientemente grande da contenere le singole stringhe.

Penso che dovresti davvero leggerlo: Tragedia Tristezza del Micro-Optimization Theatre , la tua risposta su StringBuilder v / s Concat, dopo il salto