オープン ソースのSignalRプロジェクトのソース コードを閲覧していると、 「このホット コード パスでは 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 の効率が悪い場合がある理由と、それが for に置き換えられる理由を理解しています。
しかし、StringBuilder が文字列を連結する最も効率的な方法であることを学び、経験しました。では、なぜ著者がそれを標準の連結に置き換えることにしたのか疑問に思っています。
ここで、および StringBuilder の使用について一般的に何が問題になっていますか?