オープンソースSignalRプロジェクトのソースコードを参照しています。this diff codeはと表示されています。このホットコードではStringBuilderまたはforeachを使用しないでくださいパス」:"このホットコードパスでStringBuilderまたはforeachを使用しないでください"
- public static string MakeCursor(IEnumerable<Cursor> cursors)
+ public static string MakeCursor(IList<Cursor> cursors)
{
- var sb = new StringBuilder();
- bool first = true;
- foreach (var c in cursors)
+ var result = "";
+ for (int i = 0; i < cursors.Count; i++)
{
- if (!first)
+ if (i > 0)
{
- sb.Append('|');
+ result += '|';
}
- sb.Append(Escape(c.Key));
- sb.Append(',');
- sb.Append(c.Id);
- first = false;
+ result += Escape(cursors[i].Key);
+ result += ',';
+ result += cursors[i].Id;
}
- return sb.ToString();
+ return result;
}
私はforeachのは時々あまり効率的ではなかった理由を理解し、なぜそれがために置き換えられます。
しかし、私はStringBuilderが文字列を連結する最も効率的な方法であることを知り、経験しました。だから、私はなぜそれを標準的な連結に置き換えることにしたのだろうと思っています。
ここで、そして一般的にStringBuilderの使用については何が間違っていますか?
何?それは実装に依存します。そして、はい、反復された文字列の連結を使用することは、ここでひどい考え方に見えます - 特にカーソルがたくさんある場合。 –
Jonと強く同意します。 StringBuilderのバージョンが連結バージョンより悪いと私は驚いています。ループ反復回数に応じて、より大きな起動容量でStringBuilderを初期化すると、隠された暗黙オブジェクトの初期化を防ぐのに役立ちます。両方のバージョンを測定/プロファイルしてまだ比較していますか? –
あなたは[@dfowler](http://stackoverflow.com/users/45091/dfowler)に問い合わせてください:) –