222 votes

String ou StringBuilder

Je comprends la différence entre et ( `` en final), mais y a-t-il une différence de grandes performances entre les deux ?

Le programme, je suis en train a beaucoup de cas ajoute chaîne entraînée (500 +). Utilise `` un meilleur choix ?

243voto

Jay Bazuzi Points 20462

Oui, la différence de performance est importante. Consultez l'article base de connaissances "Comment améliorer les performances de concaténation de chaîne dans Visual C#".

J'ai toujours essayé de code pour plus de clarté, d'abord, et ensuite optimiser les performances plus tard. C'est beaucoup plus facile que de le faire dans l'autre sens! Cependant, vu l'énorme différence de performances dans mes applications entre les deux, je pense maintenant un peu plus de soin.

Heureusement, il est relativement facile à exécuter l'analyse des performances de votre code pour voir où vous êtes passé du temps, et ensuite de le modifier pour utiliser StringBuilder en cas de besoin.

59voto

James Curran Points 55356

Pour clarifier ce que Gillian a dit à propos de 4 cordes, si vous avez quelque chose comme ceci:

string a,b,c,d;
 a = b + c + d;

ensuite, il serait plus rapide à l'aide de cordes et de l'opérateur plus. C'est parce que (comme Java, comme Eric points), il utilise en interne StringBuilder automatiquement (en Fait, il utilise une primitive StringBuilder utilise aussi)

Cependant, si ce que vous faites est plus proche de:

string a,b,c,d;
 a = a + b;
 a = a + c;
 a = a + d;

Ensuite, vous devez utiliser explicitement un StringBuilder. .Net ne fait pas automatiquement de créer un StringBuilder ici, parce que ce serait inutile. À la fin de chaque ligne, "un" doit être un (immuable) de la chaîne, de sorte qu'il aurait à créer et disposer d'un StringBuilder sur chaque ligne. Pour la vitesse, vous devez utiliser le même StringBuilder jusqu'à ce que vous avez terminé la construction:

string a,b,c,d;
StringBuilder e = new StringBuilder();
 e.Append(b);
 e.Append(c);
 e.Append(d);
 a = e.ToString();

31voto

calebjenkins Points 317

StringBuilder est préférable SI vous faites de multiples boucles, ou de fourchettes dans votre code pass... cependant, au niveau des performances PURES, si vous pouvez vous en sortir avec une SEULE chaîne de déclaration, alors que c'est beaucoup plus performant.

Par exemple:

string myString = "Some stuff" + var1 + " more stuff"
                  + var2 + " other stuff" .... etc... etc...;

est plus performant que

StringBuilder sb = new StringBuilder();
sb.Append("Some Stuff");
sb.Append(var1);
sb.Append(" more stuff");
sb.Append(var2);
sb.Append("other stuff");
// etc.. etc.. etc..

Dans ce cas, Chaîneconstruit pouvait être considérée comme plus facile à gérer, mais n'est pas plus performant que l'unique chaîne de déclaration.

9 fois sur 10... utiliser le générateur de chaîne.

Sur une note de côté: string + var est également plus performant que la chaîne.Format d'approche (en général), qui utilise un StringBuilder en interne (dans le doute... vérifier réflecteur!)

24voto

Matt Trunnell Points 131

Ce test montre que la pratique régulière de la concaténation est plus rapide lors de la combinaison de 3 ou moins de chaînes.

http://www.chinhdo.com/20070224/stringbuilder-is-not-always-faster/

StringBuilder peuvent apporter une amélioration significative dans l'utilisation de la mémoire, surtout dans votre cas de l'ajout de 500 chaînes.

Considérons l'exemple suivant:

string buffer = "The numbers are: ";
for( int i = 0; i < 5; i++)
{
    buffer += i.ToString();
}
return buffer;

Ce qui se passe dans la mémoire? Les chaînes de caractères suivantes sont créées:

1 - "The numbers are: "
2 - "0"
3 - "The numbers are: 0"
4 - "1"
5 - "The numbers are: 01"
6 - "2"
7 - "The numbers are: 012"
8 - "3"
9 - "The numbers are: 0123"
10 - "4"
11 - "The numbers are: 01234"
12 - "5"
13 - "The numbers are: 012345"

En ajoutant ces cinq nombres à la fin de la chaîne, nous avons créé 13 objets string! Et 12 d'entre eux ont été inutiles! Wow!

StringBuilder résout ce problème. Ce n'est pas un "mutable chaîne" comme on l'entend souvent (toutes les chaînes .NET sont immuables). Il fonctionne en gardant une mémoire tampon interne, un tableau de char. Appel Append() ou AppendLine() ajoute la chaîne de l'espace vide à la fin de la char tableau; si le tableau est trop petit, il crée un nouveau, plus grand tableau, et des copies de la mémoire tampon. Ainsi dans l'exemple ci-dessus, StringBuilder pourraient n'avoir besoin que d'un seul tableau pour contenir tous les 5 ajouts à la chaîne-- en fonction de la taille de son buffer. Vous pouvez dire StringBuilder quelle taille de son buffer doit être dans le constructeur.

14voto

Nimesh Madhavan Points 2273

N’allez pas aveuglément pour StringBuilder. Il y a des scénarios où le StringBuilder n’améliore pas la performance.

Rico Mariani a écrit deux blogues perspicace sur ceci :

http://blogs.msdn.com/ricom/archive/2003/12/02/40778.aspx

http://blogs.msdn.com/ricom/archive/2003/12/15/43628.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X