161 votes

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();

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?

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 à l'injection d'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

148voto

Kev Points 60744

String.Format utilise un StringBuilder en interne:

public static string Format(IFormatProvider provider, string format, params object[] args)
{
    if ((format == null) || (args == null))
    {
        throw new ArgumentNullException((format == null) ? "format" : "args");
    }
    StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));
    builder.AppendFormat(provider, format, args);
    return builder.ToString();
}

Le code ci-dessus est un extrait de mscorlib, donc la question est "est - StringBuilder.Append() plus rapide que l' StringBuilder.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:

http://jdixon.dotnetdevelopersjournal.com/string_concatenation_stringbuilder_and_stringformat.htm

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:

http://web.archive.org/web/20090417100252/http://jdixon.dotnetdevelopersjournal.com/string_concatenation_stringbuilder_and_stringformat.htm

À 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.

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