Dot-Net
“不要在這個熱程式碼路徑中使用 StringBuilder 或 foreach”
我正在瀏覽 Open Source 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 有什麼問題?
我進行了程式碼更改,是的,它在分配數量(GetEnumerator())呼叫與不呼叫方面產生了巨大差異。想像一下這段程式碼每秒數百萬次。分配的枚舉數是荒謬的,可以避免。
編輯:我們現在反轉控制以避免任何分配(直接寫給作者): https ://github.com/SignalR/SignalR/blob/2.0.2/src/Microsoft.AspNet.SignalR.Core/Messaging/游標.cs#L36