Quelle est la capacité par défaut d'une StringBuilder
?
Et quand faut-il (ou non) utiliser la valeur par défaut?
Le vénérable J. Skeet a bien analysé ce problème:
La capacité par défaut de StringBuilder est de 16 caractères (j'ai utilisé .NET Reflector pour le savoir).
La valeur par défaut est 16, ce qui semble être la capacité par défaut de tout type de tableau ou de liste dans le framework .NET. Moins vous aurez besoin de réaffectations de ressources sur votre StringBuilder, mieux ce sera. En attendant, il est inutile d'allouer beaucoup plus que nécessaire.
En règle générale, j'instancie StringBuilder avec un type d'estimation approximative de la taille finale de StringBuilder. Par exemple, cela pourrait être basé sur un nombre d'itérations que vous utiliserez plus tard pour construire la chaîne, multiplié par la taille requise pour chaque élément de cette itération.
// 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++ )
{
...
}
Lorsque la taille d'un StringBuilder est trop petite pour écrire la chaîne suivante, le tableau de caractères interne de StringBuilder est réaffecté à deux fois sa taille actuelle.
Cette question a été soulevée aujourd’hui comme un doublon, mais j’ai remarqué qu’une partie n’avait pas reçu de réponse. La valeur par défaut (en supposant que cela signifie "lorsqu'elle n'est pas créée avec une chaîne suffisamment grande pour être requise) est 16 comme l'ont dit les gens, mais je ne vois rien ici pour vous demander de le changer.
Vous le changez lorsque vous pouvez le faire comme une optimisation possible. En effet, le choix de 16 est l’opposé d’une optimisation. Optimisation choisit des valeurs et des approches de manière à convenir particulièrement bien à un cas particulier ou à un sous-ensemble de cas possibles (et non "à accélérer le processus" en général, bien que nous utilisions souvent Word dans notre cas). Ici, le concepteur de la classe a dû gérer généraliser - choisir des valeurs et des approches de manière à donner une performance raisonnablement bonne dans un large éventail de cas.
Plus ils sont petits, moins la mémoire est utilisée.
Plus ils sont gros, moins il y a de réallocation pour traiter les plus grandes chaînes.
Il y a quelques raisons pour lesquelles un tour binaire (puissance entière de deux) est susceptible de donner de meilleures performances que d'autres nombres dans certains cas, alors ils ont opté pour l'un d'entre eux, mais à part le choix entre 4, 16 ou 1024 était une question de équilibrer différentes valeurs probables.
Quelqu'un utilisant StringBuilder
plutôt que de le concevoir, peut avoir une meilleure idée de la taille dont il aura probablement besoin.
S'ils vont utiliser Append
5 nombres à 1 chiffre avec des chaînes d'une longueur totale de 43 caractères, la longueur totale de StringBuilder
sera de 48 caractères, quoi qu'il en soit, ils doivent donc utiliser une capacité de 48 caractères comme 48 toujours la taille la plus efficace pour une chaîne de 48 longueurs.
S'ils font quelque chose où il pourrait y avoir une longueur comprise entre environ 23 et 34 caractères, ils devraient utiliser 34.
S'ils font quelque chose où il n'y aura probablement jamais plus de 60 caractères, mais que de temps à autre, ils devraient en utiliser 64 (ne pas réaffecter la plupart des éléments et obtenir le bénéfice de la puissance de deux mentionné ci-dessus pour les quelques cas où vous faites).
S'il est impossible de parvenir à une conclusion à ce sujet, ou du moins difficile de le faire et pas un point chaud de performance, vous devriez simplement utiliser le paramètre par défaut.
Nous pouvons trouver la capacité en utilisant la propriété de capacité de la classe StringBuilder
:
StringBuilder builder = new StringBuilder();
var capacity = builder.Capacity;
var maxCapacity = builder.MaxCapacity;
Ici, capacité définit la capacité par défaut de StringBuilder
.
StringBuilder
est Max Capacity
est identique à la valeur maximale de Int32
.
La capacité par défaut d'un générateur de chaînes est 16 caractères , et la capacité maximale de Générateur de chaînes est 2147483647 caractères .
Donc pas besoin de s'inquiéter pour stocker une réponse longue !!!
[modifier: à l'époque, la question posée à propos de StringList
name__]
Voulez-vous dire StringCollection
name__? Cela utilise initialement un ArrayList
vide, donc la réponse est 0. Et vous n'avez aucune option pour le changer. Lorsque vous ajoutez un élément pour la première fois, la capacité passe à 4, puis utilise une stratégie de doublage lorsqu'elle est remplie.
Si vous voulez dire List<string>
, alors il est similaire (un T[]
vide, pas un ArrayList
nom__), mais vous pouvez initialiser une taille connue si vous avez besoin (c.-à-d. Combien de données vous attendez). De nouveau, la première fois que vous Add
à un List<T>
, la taille passe à 4, puis double à chaque remplissage.