c# - 为什么 String.Concat 没有针对 StringBuilder.Append 进行优化?

标签 c# .net string optimization clr

我发现编译器将常量字符串表达式的串联优化为一个字符串。

现在只有在运行时才知道字符串的字符串串联,为什么编译器不优化循环中的字符串串联和 10 个以上字符串的串联,而是使用 StringBuilder.Append?我的意思是,这是可能的,对吧?实例化一个 StringBuilder 并进行每次连接并将其转换为 Append() 调用。

有什么理由可以优化?我错过了什么?

最佳答案

肯定的答案必须来自编译器设计团队。但是让我在这里试一试......

如果你的问题是,为什么编译器不转这个:

string s = "";
for( int i = 0; i < 100; i ++ )
    s = string.Concat( s, i.ToString() );

进入这个:

StringBuilder sb = new StringBuilder();
for( int i = 0; i < 100; i++ )
    sb.Append( i.ToString() );
string s = sb.ToString();

最有可能的答案是这不是优化。这是对代码的重写,它根据开发人员而非编译器的知识和意图引入了新的结构。

这种类型的更改需要编译器对 BCL 的了解超出适当的范围。如果明天可以使用一些更优化的字符串汇编服务会怎样?编译器应该使用它吗?

如果您的循环条件更复杂怎么办,编译器是否应该尝试执行一些静态分析以确定这种重写的结果在功能上是否仍然等效?在许多方面,这就像解决 halting problem .

最后,我不确定在所有情况下这都会导致代码执行得更快。实例化 StringBuilder 并调整其内部缓冲区大小是有代价的附加文本。事实上,附加的成本与被连接的字符串的大小、有多少、内存压力有多大密切相关。这些是编译器无法提前预测的。

作为开发人员,您的工作是编写性能良好的代码。编译器只能通过进行某些安全、不变性保留优化来提供帮助。不会为您重写代码。

关于c# - 为什么 String.Concat 没有针对 StringBuilder.Append 进行优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2177447/

相关文章:

c# - 离开多播组时通知

c# - Linq复制/复制整个记录

.net - 温莎城堡 : How to wire up a component to a factory property rather than method

asp.net - DotNet 核心设置失败

python - python pyautogui中反斜杠的编码

c# - 如何最好地使用 VSTO 从 excel 中获取单元格值?

c# - 样式仅适用于两个元素

c# - .NET CLR 运行时方法替换

将用户输入字符串与存储在指针中的字符串进行比较。 C

C#,一种在两个或多个空格的第一次(也是第一次)出现时拆分字符串的优雅方法?