Dot-Net

“不要在這個熱程式碼路徑中使用 StringBuilder 或 foreach”

  • September 11, 2012

我正在瀏覽 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

引用自:https://stackoverflow.com/questions/12372251