Supposons que j'ai un constructeur de chaînes en C # qui fait ceci:
StringBuilder sb = new StringBuilder();
string cat = "cat";
sb.Append("the ").Append(cat).(" in the hat");
string s = sb.ToString();
serait-ce aussi efficace ou plus efficace que d'avoir:
string cat = "cat";
string s = String.Format("The {0} in the hat", cat);
Si oui, pourquoi?
ÉDITER
Après quelques réponses intéressantes, j'ai réalisé que j'aurais probablement dû être un peu plus clair dans ce que je demandais. Je n'ai pas tellement demandé ce qui était le plus rapide pour concaténer une chaîne, mais ce qui est plus rapide pour injecter une chaîne dans une autre.
Dans les deux cas ci-dessus, je souhaite injecter une ou plusieurs chaînes au milieu d'une chaîne de modèle prédéfinie.
Désolé pour la confusion
string s = "The "+cat+" in the hat";
- dessus pourrait être le plus rapide à moins qu'il ne soit utilisé dans une boucle, auquel cas le plus rapide sera avec unStringBuilder
initialisé en dehors de la boucle.Réponses:
REMARQUE: cette réponse a été écrite lorsque .NET 2.0 était la version actuelle. Cela peut ne plus s'appliquer aux versions ultérieures.
String.Format
utilise un enStringBuilder
interne:Le code ci-dessus est un extrait de mscorlib, donc la question devient "est
StringBuilder.Append()
plus rapide queStringBuilder.AppendFormat()
"?Sans analyse comparative, je dirais probablement que l'exemple de code ci-dessus fonctionnerait plus rapidement en utilisant
.Append()
. Mais c'est une supposition, essayez de comparer et / ou de profiler les deux pour obtenir une comparaison correcte.Ce type, Jerry Dixon, a fait des analyses comparatives:
Actualisé:
Malheureusement, le lien ci-dessus est mort depuis. Cependant, il y en a encore une copie sur la Way Back Machine:
À la fin de la journée, cela dépend si le formatage de votre chaîne sera appelé de manière répétitive, c'est-à-dire que vous effectuez un traitement de texte sérieux sur 100 mégaoctets de texte, ou s'il est appelé lorsqu'un utilisateur clique de temps en temps sur un bouton. À moins que vous ne fassiez un énorme travail de traitement par lots, je m'en tiendrai à String.Format, cela facilite la lisibilité du code. Si vous soupçonnez un goulot d'étranglement des performances, collez un profileur sur votre code et voyez où il se trouve réellement.
la source
.ToString()
l'StringBuilder
objet. Sur un grand nombre d'itérations, ce temps fait une grande différence et signifie qu'il ne compare pas tout à fait des pommes avec des pommes. C'est la raison pour laquelle il montre de si bonnes performancesStringBuilder
et explique probablement sa surprise. Je viens de répéter le benchmark en corrigeant cette erreur et j'ai obtenu les résultats escomptés: l'String
+
opérateur a été le plus rapide, suivi deStringBuilder
,String.Format
en remontant l'arrière.À partir de la documentation MSDN :
la source
J'ai exécuté quelques tests de performances rapides, et pour 100000 opérations en moyenne sur 10 exécutions, la première méthode (String Builder) prend presque la moitié du temps de la seconde (String Format).
Donc, si cela n'est pas fréquent, cela n'a pas d'importance. Mais s'il s'agit d'une opération courante, vous pouvez utiliser la première méthode.
la source
Je m'attendrais à ce que String.Format soit plus lent - il doit analyser la chaîne, puis la concaténer.
Quelques notes:
la source
Je pense que dans la plupart des cas, cette clarté, et non l'efficacité, devrait être votre plus grande préoccupation. À moins que vous n'écrasiez des tonnes de cordes ou que vous construisiez quelque chose pour un appareil mobile moins puissant, cela ne fera probablement pas beaucoup de différence dans votre vitesse de course.
J'ai trouvé que, dans les cas où je construis des chaînes de manière assez linéaire, faire des concaténations droites ou utiliser StringBuilder est votre meilleure option. Je suggère cela dans les cas où la majorité de la chaîne que vous construisez est dynamique. Comme très peu de texte est statique, le plus important est qu'il soit clair où chaque morceau de texte dynamique est placé au cas où il aurait besoin d'être mis à jour à l'avenir.
D'un autre côté, si vous parlez d'un gros morceau de texte statique avec deux ou trois variables, même si c'est un peu moins efficace, je pense que la clarté que vous gagnez avec la chaîne en vaut la peine. Je l'ai utilisé plus tôt cette semaine lorsque j'ai dû placer un morceau de texte dynamique au centre d'un document de 4 pages. Il sera plus facile de mettre à jour ce gros morceau de texte s'il est en un seul morceau que d'avoir à mettre à jour trois morceaux que vous concaténez.
la source
Ne serait-ce que parce que string.Format ne fait pas exactement ce que vous pourriez penser, voici une reprise des tests 6 ans plus tard sur Net45.
Concat est toujours le plus rapide mais il y a vraiment moins de 30% de différence. StringBuilder et Format diffèrent à peine de 5 à 10%. J'ai eu des variations de 20% en exécutant les tests plusieurs fois.
Millisecondes, un million d'itérations:
La leçon que je retire est que la différence de performances est insignifiante et qu'elle ne devrait donc pas vous empêcher d'écrire le code lisible le plus simple possible. Ce qui pour mon argent est souvent mais pas toujours
a + b + c
.la source
String.Format utilise en
StringBuilder
interne ... donc logiquement cela conduit à l'idée qu'il serait un peu moins performant en raison de plus de frais généraux. Cependant, une simple concaténation de chaînes est la méthode la plus rapide pour injecter une chaîne entre deux autres ... de manière significative. Cette preuve a été démontrée par Rico Mariani dans son tout premier Quiz Performance, il y a des années. Le simple fait est que les concaténations ... lorsque le nombre de parties de cordes est connu (sans limitation..vous pouvez concaténer mille parties ... tant que vous connaissez toujours ses 1000 parties) ... sont toujours plus rapides queStringBuilder
ou String. Format. Ils peuvent être effectués avec une seule allocation de mémoire et une série de copies de mémoire. Voici la preuveEt voici le code réel de certaines méthodes String.Concat, qui appellent finalement FillStringChecked qui utilise des pointeurs pour copier la mémoire (extraite via Reflector):
Donc alors:
Prendre plaisir!
la source
Oh aussi, le plus rapide serait:
la source
StringBuilder
qui sont faites pour optimiser ce type de codage en premier lieu.Cela dépend vraiment. Pour les petites chaînes avec peu de concaténations, il est en fait plus rapide d'ajouter simplement les chaînes.
Mais pour des chaînes plus grandes (très très grandes chaînes), il est alors plus efficace d'utiliser StringBuilder.
la source
Dans ce cas, je suggérerais que String.Format est le plus rapide car il est conçu dans ce but précis.
la source
Cela dépend vraiment de votre modèle d'utilisation.
Un benchmark détaillé entre
string.Join
,string,Concat
etstring.Format
peut être trouvé ici: String.Format Is not Adapt for Intensive Loggingla source
Je suggérerais de ne pas le faire, puisque String.Format n'a pas été conçu pour la concaténation, il a été conçu pour formater la sortie de diverses entrées telles qu'une date.
la source