Question

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

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

Était-ce utile?

La solution

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

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

Autres conseils

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

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.

Généralement, j'instancie StringBuilder avec une sorte 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 été répondue. 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 pas le moment où vous devriez 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. Optimization choisit des valeurs et des approches qui conviennent particulièrement bien à un cas particulier ou à un sous-ensemble de cas possibles (et non & "en accélérant les choses &"; bien que ce soit souvent le cas). utilise le mot). Dans ce cas, le concepteur de la classe a dû gérer la généralisation - en choisissant des valeurs et des approches de manière à obtenir des performances relativement bonnes dans un large éventail de cas.

Plus ils sont petits, moins la mémoire est utilisée.

Plus ils étaient gros, moins il y avait de réallocation pour traiter les chaînes plus volumineuses.

Il y a quelques raisons pour lesquelles un tour binaire (puissance entière de deux) donne probablement 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: une question d'équilibre entre différentes valeurs probables.

Une personne utilisant StringBuilder plutôt que de la concevoir peut avoir une meilleure idée de la taille dont elle aura probablement besoin.

S'ils vont Append 5 numéros à 1 chiffre avec des chaînes totalisant 43 caractères, la longueur totale de <=> sera de 48 caractères quoi qu'il en soit, ils doivent donc utiliser une capacité de 48 à 48 est toujours la taille la plus efficace pour une chaîne de 48 longueurs.

S'ils font quelque chose dont la longueur est comprise entre 23 et 34 caractères environ, ils doivent utiliser 34 caractères.

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 l'avantage de la puissance de deux mentionné ci-dessus pour les quelques cas où vous le faites).

S'il est impossible de tirer une conclusion à ce sujet, ou du moins difficile et de ne pas créer un point chaud de performance, vous devez simplement utiliser la valeur par défaut.

Nous pouvons trouver la capacité à l'aide de la propriété de capacité de la StringBuilder Classe:

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

Ici, capacité définit la capacité par défaut de Max Capacity.

Int32 est <=> identique à la valeur maximale de <=>.

[edit: à l'époque, la question posée sur StringList]

Voulez-vous dire StringCollection? Cela utilise initialement un ArrayList vide, la réponse est donc 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 Add), mais vous pouvez initialiser une taille connue si vous en avez besoin (c'est-à-dire que vous savez combien de données vous attendez). Encore une fois, la première fois que vous List<T> passez à un <=>, la taille passe à 4, puis double à chaque remplissage.

La capacité par défaut d'un constructeur de chaînes est 16 caractères , Et la capacité maximale de Builder est de 2147483647 caractères .

Donc pas besoin de s'inquiéter pour stocker une longue réponse !!!

En savoir plus sur Capacité de constructeur de chaînes , il existe un exemple d'application pour le prouver aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top