1. ホーム
  2. c#

[解決済み] String.FormatはStringBuilderと同じように効率的か?

2022-04-25 10:17:07

質問

C#でこのような文字列構築ソフトがあったとします。

StringBuilder sb = new StringBuilder();
string cat = "cat";
sb.Append("the ").Append(cat).(" in the hat");
string s = sb.ToString();

を持つのと同じくらい、あるいはそれ以上に効率的なのでしょうか?

string cat = "cat";
string s = String.Format("The {0} in the hat", cat);

もしそうなら、なぜ?

EDIT

いくつかの興味深い回答があった後、私はおそらく私が尋ねていたことをもう少し明確にするべきだったことに気づきました。私は、文字列の連結にどちらが速いかを聞いていたのではなく インジェクション という文字列を別の文字列に変換します。

上記のいずれの場合も、定義済みのテンプレート文字列の途中に1つ以上の文字列を注入したいのです。

わかりにくくてすみません

解決方法は?

注意事項 この回答は、.NET 2.0が現在のバージョンであったときに書かれたものです。それ以降のバージョンでは、もはや適用されないかもしれません。

String.FormatStringBuilder を内部で使用しています。

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

上のコードは mscorlib のスニペットなので、問題は "である。 StringBuilder.Append() よりも高速に StringBuilder.AppendFormat() ということですか?

ベンチマークを行わなければ、上記のコードサンプルは、おそらく .Append() . しかし、これは推測であり、ベンチマークやプロファイリングを行い、適切な比較をしてみてください。

Jerry Dixonという人がベンチマークをしました。

<ブロッククオート

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

更新しました。

残念ながら、上記のリンクは消滅してしまいました。しかし、Way Back Machineにはまだコピーが残っています。

<ブロッククオート

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

結局のところ、文字列フォーマットが繰り返し呼び出されるのか、つまり、100メガバイト以上のテキストを真剣に処理するのか、それともユーザーが時々ボタンをクリックしたときに呼び出されるのかによって、その方法は異なります。大規模なバッチ処理でない限り、私はString.Formatを使うことにしています。もし、性能のボトルネックがあると思われるなら、プロファイラでコードを調べて、その原因を突き止めましょう。