Est Une Chaîne.Format aussi efficace que StringBuilder
Supposons que j'ai un stringbuilder en C# qui fait cela:
StringBuilder sb = new StringBuilder();
string cat = "cat";
sb.Append("the ").Append(cat).(" in the hat");
string s = sb.ToString();
que ce serait aussi efficace ou plus efficace que d'avoir:
string cat = "cat";
string s = String.Format("The {0} in the hat", cat);
Si oui, pourquoi?
MODIFIER
Après quelques réponses intéressantes, j'ai réalisé que je devrais probablement avoir été un peu plus clair dans ce que je leur demandais. Je n'étais pas tellement demandant qui était plus rapide lors de la concaténation d'une chaîne de caractères, mais qui est plus rapide à injection une chaîne dans une autre.
Dans les deux cas ci-dessus, je veux injecter un ou plusieurs des chaînes dans le milieu d'un modèle prédéfini de la chaîne.
Désolé pour la confusion
- Merci de laisser ces ouverte afin de permettre à de futures améliorations.
- Dans un cas, le moyen le plus rapide est ni l'un ni l': si la partie à remplacer est de taille égale à la nouvelle partie, vous pouvez changer la chaîne en place. Malheureusement, cela nécessite de la réflexion ou le code unsafe et délibérément enfreint l'immutabilité de la chaîne. Pas une bonne pratique, mais si la vitesse est un problème... 🙂
- dans l'exemple donné ci-dessus
string s = "The "+cat+" in the hat";
pourrait être le plus rapide, sauf si elle est utilisée dans une boucle, dans ce cas, le plus rapide sera avec unStringBuilder
initialisé en dehors de la boucle.
Vous devez vous connecter pour publier un commentaire.
REMARQUE: Cette réponse a été écrit quand .NET 2.0 est la version actuelle. Cela peut ne plus s'appliquer aux versions ultérieures.
String.Format
utilise unStringBuilder
en interne:Le code ci-dessus est un extrait de mscorlib, donc la question se pose "est
StringBuilder.Append()
plus vite queStringBuilder.AppendFormat()
"?Sans benchmarking, je dirais probablement que l'exemple de code ci-dessus s'exécuter plus rapidement en utilisant
.Append()
. Mais c'est une supposition, essayez d'analyse comparative et/ou de profilage les deux pour en faire une véritable comparaison.Ce chap, Jerry Dixon, fait un peu de benchmarking:
Mise à jour:
Malheureusement le lien ci-dessus est décédé depuis. Toutefois, il y a toujours une copie sur le Chemin du Retour de la Machine:
À la fin de la journée cela dépend si votre chaîne de formatage va être appelée de façon répétitive, c'est à dire, vous faites des graves de traitement de texte de plus de 100 méga-octets de texte, ou s'il est appelé lorsque l'utilisateur clique sur un bouton maintenant et encore. Sauf si vous êtes en train de faire un énorme lot de traitement d'emploi que j'ai coller avec de la Ficelle.Format, il contribue à la lisibilité du code. Si vous soupçonnez une perf goulot d'étranglement puis coller un profiler sur votre code et de voir où il est vraiment.
.ToString()
sur leStringBuilder
objet. Sur un grand nombre d'itérations, que le temps fait une grande différence, et signifie qu'il n'est pas tout à fait comparer des pommes avec des pommes. C'est la raison pour laquelle il montre ces grandes performances pourStringBuilder
et représente probablement sa surprise. J'ai juste répété le test de corriger cette erreur et a obtenu les résultats attendus: laString
+
de l'opérateur a été le plus rapide, suivi parStringBuilder
, avecString.Format
l'éducation de l'arrière.De la La documentation MSDN:
J'ai couru quelques tests de performance, et pour 100 000 opérations en moyenne plus de 10 pistes, la première méthode (String Builder) prend presque la moitié du temps de la seconde (Format de Chaîne de caractères).
Donc, si cela est rare, il n'a pas d'importance. Mais si c'est une opération courante, alors vous pouvez utiliser la première méthode.
Je m'attends à ce Chaîne.Format à être plus lente, il doit analyser la chaîne et puis concaténer il.
Couple de notes:
Si seulement en raison de la chaîne.Format n'est pas exactement ce que vous pourriez penser, voici une reprise de l'tests 6 ans plus tard, Net45.
Concat est encore plus rapide, mais vraiment, c'est moins de 30% de différence. StringBuilder et Format diffèrent à peine de 5 à 10%. J'ai eu des variations de 20% d'exécuter les tests un peu de temps.
Millisecondes, un million d'itérations:
La leçon que je retiens, c'est que la différence de performances est trivial et donc il ne devrait pas vous arrêter de l'écriture la plus simple lisible le code vous pouvez. Qui pour mon argent est souvent, mais pas toujours
a + b + c
.Je pense que dans la plupart des cas comme cette clarté, et non pas l'efficacité, devrait être votre principale préoccupation. Sauf si vous êtes de concassage ensemble des tonnes de chaînes, ou de construire quelque chose pour une puissance moindre, appareil mobile, ce ne sera probablement pas faire beaucoup de trou dans votre vitesse de course.
J'ai trouvé que, dans les cas où je suis en train de construire des chaînes dans un assez linéaire de la mode, de le faire directement des enchaînements ou à l'aide de StringBuilder est votre meilleure option. Je vous le suggère dans le cas où la majorité de la chaîne que vous êtes en train de construire est dynamique. Depuis très peu de texte statique, la chose la plus importante est qu'il est clair, où chaque morceau de texte dynamique est en cours de mise dans le cas où il a besoin de mise à jour dans le futur.
D'autre part, 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é de votre gain de la chaîne.Du fait de son Format en vaut la peine. J'ai utilisé ce début de semaine, lors d'avoir à les placer un peu de texte dynamique dans le centre de la page 4 du document. Il sera plus facile de mettre à jour ce gros morceau de texte si son dans une pièce que d'avoir à mettre à jour trois morceaux que vous concaténer ensemble.
Chaîne.Format utilise
StringBuilder
en interne...donc, logiquement, qui mène à l'idée qu'il serait un peu moins performant en raison de plus de surcharge. Toutefois, une simple concaténation de chaîne est la méthode la plus rapide de l'injection d'une chaîne de caractères entre les deux others...by un degré significatif. Cette preuve a été démontré par Rico Mariani dans sa première Performance d'un Questionnaire, il y a des années. Simple fait est que les concaténations de...lorsque le nombre de parties de chaîne est connue (sans limitation..on peut concaténer un millier de pièces...aussi longtemps que vous savez c'est toujours 1000 pièces)...sont toujours plus vite queStringBuilder
ou Chaîne.Format. Ils peuvent être réalisées avec une seule allocation de mémoire une série de la mémoire des copies. Ici est la preuveEt voici le code pour une Chaîne de caractères.Concat méthodes, qui finalement l'appel FillStringChecked qui utilise des pointeurs pour copier de la mémoire (extraite par de l'Réflecteur):
Alors:
Profitez-en!
Oh d'ailleurs, le plus rapide serait:
StringBuilder
qui est fait pour optimiser ce type de codage en premier lieu.Ça dépend vraiment. Pour les petites chaînes avec quelques enchaînements, il est effectivement plus rapide juste pour ajouter les chaînes.
Mais pour la plus grande chaîne de (très très grandes chaînes de caractères), il est donc plus efficace à utiliser StringBuilder.
Dans ce cas, je suggère de Chaîne.Le Format est le plus rapide, car il est la conception pour que le but exact.
Cela dépend vraiment de votre modèle d'utilisation.
Détaillée de référence entre
string.Join
,string,Concat
etstring.Format
peut être trouvé ici: Chaîne de caractères.Le Format N'est pas Adapté pour l'exploitation forestière IntensiveJe dirais ne pas, depuis la Chaîne.Le Format n'a pas été conçu pour la concaténation, il a été conçu pour la mise en forme de la sortie de différentes entrées telles qu'une date.