gpt4 book ai didi

.net - "Don' t 在这个热代码路径中使用 StringBuilder 或 foreach”

转载 作者:行者123 更新时间:2023-12-02 07:53:00 27 4
gpt4 key购买 nike

我正在浏览开源的源代码SignalR项目,我看到 this diff code标题为“不要在此热代码路径中使用 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/Cursor.cs#L36

关于.net - "Don' t 在这个热代码路径中使用 StringBuilder 或 foreach”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12372251/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com