String と StringBuilder のパフォーマンスの違いを説明している .NET Gotchas (IMO を読む価値は十分あります) という本を読んでいます。どちらのクラスの内部構造も (これらのクラスの反映されたバージョンを見ずに) 知りませんが、疑問に思っていました。.NET の演算子はオーバーロード可能であるため、Microsoft が String クラスを実装して StringBuilder を内部で使用し、連結演算子をオーバーロードして単純に StringBuilder で .Append() を呼び出さなかったのはなぜですか? なぜそうではないのかについては、いくつかの根本的な理由があると思います。もしそうなら、なぜですか?
3526 次
2 に答える
7
問題は、文字列の連結が遅いということではなく、連結を繰り返すと、割り当てて後でガベージ コレクションする必要がある中間文字列が大量に作成されることです。
編集前の文字列に単純に「a」を追加しない
ことに注意してください。mystring += "a"
組み合わせ用の新しい文字列を作成し、「mystring」をポイントすることで、以前の値を破棄します (参照がない場合)。
編集終了
シリーズ
string mystring = "something";
mystring += "something else";
mystring = mystring + "third";
StringBuilder Append に続いて .ToString() として各行を個別に実行し、結果を文字列に戻すと、パフォーマンスが低下します。単一の StringBuilder を使用して Append() を繰り返し使用し、最後に .ToString() を実行した場合にのみ、パフォーマンス上の利点が得られます。
StringBuilder sb = new StringBuilder();
sb.Append("something");
sb.Append("something else");
sb.Append("third");
string mystring = sb.ToString();
そして、 StringBuilder には独自のオーバーヘッドがあるため、結合する文字列部分が少数の場合はメリットがありません。
コンパイラは、単一のステートメントで連結を最適化することに注意してください。
string mystring = "something" + "something else" + "third";
最速です。
于 2012-08-02T10:15:34.280 に答える
5
理由は簡単です。
なぜなら
string result = a + b;
よりも効率的です
var sb = new StringBuilder(a, a.Length + b.Length);
sb.Append(b);
string result = sb.ToString();
StringBuilder
s は、通常はループ内で多くの連結が発生している場合にのみ意味があります。
于 2012-08-02T10:08:00.763 に答える