Domanda

Qual è la capacità predefinita di un StringBuilder?

E quando dovrebbe (o non dovrebbe) essere usato il default?

È stato utile?

Soluzione

Il Venerabile J. Skeet ha fornito una buona analisi proprio di questo problema:

https://jonskeet.uk/csharp/stringbuilder.html

Altri suggerimenti

La capacità predefinita di StringBuilder è di 16 caratteri (ho usato .NET Reflector per scoprirlo).

L'impostazione predefinita è 16, che sembra essere la capacità predefinita di qualsiasi tipo di array o elenco nel framework .NET. Meno numero di riallocazioni è necessario sul StringBuilder, meglio è. Nel frattempo, non è necessario allocare molto più del necessario.

Di solito istanzio StringBuilder con qualche tipo di stima approssimativa della dimensione finale di StringBuilder. Ad esempio, questo potrebbe essere basato su un conteggio delle iterazioni che utilizzerai in seguito per creare la stringa, moltiplicato per le dimensioni necessarie per ciascun elemento in questa iterazione.

// where 96 is a rough estimate of the size needed for each item
StringBuilder sb = new StringBuilder ( count * 96 );
for ( int i = 0; i < count; i++ )
{
...
}

Quando la dimensione di StringBuilder è troppo piccola per scrivere la stringa successiva, l'array di caratteri interno di StringBuilder viene riallocato al doppio della sua dimensione attuale.

Questa domanda è emersa oggi come un duplicato di un'altra, ma noto che una parte non ha ricevuto risposta. L'impostazione predefinita (supponendo che significhi & Quot; quando non viene creata con una stringa abbastanza grande da richiedere) è 16 come dicevano le persone, ma non vedo nulla qui quando dovresti cambiarlo.

Lo cambi quando puoi farlo come possibile ottimizzazione. In effetti, la scelta di 16 è l'opposto di un'ottimizzazione. Ottimizzazione è scegliere valori e approcci in modo da adattarsi particolarmente bene a un caso particolare o a un sottoinsieme di casi possibili, (non " rendendo le cose più veloci " in generale, anche se è così che spesso usa la parola). Qui il progettista della classe ha avuto a che fare con la generalizzazione - selezionando valori e approcci in modo da fornire prestazioni ragionevolmente buone in un'ampia gamma di casi.

Più piccole erano, meno uso della memoria.

Più andavano grandi, meno riallocazione per gestire stringhe più grandi.

Ci sono alcuni motivi per cui il giro binario (interi poteri di due) è in grado di fornire prestazioni migliori rispetto ad altri numeri in determinati casi, quindi hanno optato per uno di quelli, ma a parte la scelta tra 4 o 16 o 1024 era una questione di bilanciamento di diversi valori probabili.

Qualcuno che utilizza StringBuilder anziché progettarlo, potrebbe avere un'idea migliore delle dimensioni che potrebbero avere bisogno.

Se stanno andando a Append 5 numeri di 1 cifra insieme a stringhe che hanno una lunghezza totale di 43 caratteri, la lunghezza totale di <=> sarà di 48 caratteri a prescindere da cosa, quindi dovrebbero usare una capacità di 48 come 48 è sempre la dimensione più efficiente per una stringa di 48 lunghezze.

Se stanno facendo qualcosa in cui potrebbe esserci una lunghezza tra circa 23 e 34 caratteri, dovrebbero usare 34.

Se stanno facendo qualcosa in cui probabilmente non ci saranno mai più di 60 caratteri, ma ogni tanto potrebbero esserci, dovrebbero usare 64 (non riallocare per la maggior parte delle parti e ottenere il vantaggio della potenza di due di cui sopra per i pochi casi in cui lo fai).

Se è impossibile giungere a una conclusione su questo, o almeno difficile farlo e non un hot-spot delle prestazioni, allora dovresti semplicemente usare il valore predefinito.

Possiamo trovare la capacità usando la proprietà capacity della StringBuilder Classe:

StringBuilder builder = new StringBuilder();
var capacity = builder.Capacity;
var maxCapacity = builder.MaxCapacity;

Qui la capacità definisce la capacità predefinita di Max Capacity.

Int32 è <=> è uguale al valore massimo di <=>.

[modifica: al momento, la domanda posta su StringList]

Intendi StringCollection? Inizialmente utilizza un ArrayList vuoto, quindi la risposta è 0. E non hai alcuna possibilità di cambiarlo. Quando aggiungi un oggetto per la prima volta, la capacità passa a 4, quindi usa una strategia di raddoppio quando si riempie.

Se intendi List<string>, allora è simile (un T[] vuoto, non un Add), ma puoi inizializzare una dimensione nota se ne hai bisogno (cioè sai quanti dati ti aspetti). Ancora una volta, la prima volta che List<T> a <=> la dimensione passa a 4, quindi raddoppia ogni volta che si riempie.

La capacità predefinita di uno String-Builder è 16 caratteri , E la capacità massima di String-Builder è 2147483647 caratteri .

Quindi non c'è bisogno di preoccuparsi per la memorizzazione di risposte lunghe !!!

leggi informazioni su Capacità del costruttore di stringhe , esiste un'app di esempio per dimostrarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top