可能重复:
Why is String.Concat not optimized to StringBuilder.Append?
有一天,我正在向我的一个朋友咆哮一个特定的Telerik控件。我告诉他生成一个控制树花了几秒钟,在分析后我发现它在循环中使用字符串连接而不是StringBuilder。重写后,它几乎立即起作用。
所以我的朋友听说过,并且似乎很惊讶C#编译器没有像Java编译器那样自动进行转换。阅读Eric Lippert的许多答案,我意识到这个功能没有成功,因为它不值得考虑。但是,如果假设成本实现它的成本很小,那么什么理由会阻止人们去做呢?
答案 0 :(得分:9)
我注意到这与
完全相同Why is String.Concat not optimized to StringBuilder.Append?
所以这可能应该关闭。
但是,如果假设成本很小,实施它的成本是什么原因会阻止一个人做这件事呢?
听起来你提出了一些同义反复:如果没有理由不做X,那么有没有理由不做X?否。
我认为对于假设的,反事实性问题的答案知之甚少。或许更好的问题是关于现实世界的问题:
是否有使用此优化的编程语言?
是。在JScript.NET中,我们检测循环中的字符串连接,编译器将它们转换为字符串构建器的调用。
然后可能会跟进:
JScript .NET和C#之间有什么区别可以证明一种语言的优化是合理的,而不是另一种语言的优化?
JScript.NET的一个核心假设是它的程序员大多数都是JavaScript程序员,其中许多人已经构建了必须在ECMAScript的任何实现中运行的库。那些程序员可能不太了解.NET框架,即使他们这样做,他们也可能无法使用StringBuilder而不使他们的库代码不可移植。也可以合理地假设JavaScript程序员可能是新手程序员,也可能是程序员通过他们的业务而不是计算机科学课程来编程。
C#程序员更有可能很好地了解.NET框架,编写与框架一起工作的库,并且是经验丰富的程序员,他们理解为什么循环字符串连接是O(n 2 )在天真的实施。他们需要编译器生成的优化,因为如果他们认为有必要,他们可以自己完成。
简而言之:编译器功能是指我们的预算用于为客户增加价值;将这个功能添加到JScript.NET比将其添加到C#中更多“砰然一声”。
答案 1 :(得分:6)
C#编译器的效果要好于此。
a + b + c
编译为String.Concat(a, b, c)
, 比StringBuilder
更快。
"a" + "b"
直接编译为"ab"
(对多行文字很有用)。
唯一使用StringBuilder
的地方是在循环内重复连接时;编译器无法轻松优化它。