web-dev-qa-db-fra.com

Capacité par défaut de StringBuilder

Quelle est la capacité par défaut d'une StringBuilder?

Et quand faut-il (ou non) utiliser la valeur par défaut?

31
Matt Lacey

Le vénérable J. Skeet a bien analysé ce problème:

http://www.yoda.arachsys.com/csharp/stringbuilder.html

4
endian

La capacité par défaut de StringBuilder est de 16 caractères (j'ai utilisé .NET Reflector pour le savoir).

42
Alan

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.

35
baretta

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.

11
Jon Hanna

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.

1
user2761122

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 !!!

0
Deep Jadia

[modifier: à l'époque, la question posée à propos de StringListname__]

Voulez-vous dire StringCollectionname__? Cela utilise initialement un ArrayListvide, 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 ArrayListnom__), 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.

0
Marc Gravell