为什么字符串连接在C#中没有自动转换为StringBuilder?

时间:2012-02-03 05:42:37

标签: c# string stringbuilder compiler-optimization

  

可能重复:
  Why is String.Concat not optimized to StringBuilder.Append?

有一天,我正在向我的一个朋友咆哮一个特定的Telerik控件。我告诉他生成一个控制树花了几秒钟,在分析后我发现它在循环中使用字符串连接而不是StringBuilder。重写后,它几乎立即起作用。

所以我的朋友听说过,并且似乎很惊讶C#编译器没有像Java编译器那样自动进行转换。阅读Eric Lippert的许多答案,我意识到这个功能没有成功,因为它不值得考虑。但是,如果假设成本实现它的成本很小,那么什么理由会阻止人们去做呢?

2 个答案:

答案 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的地方是在循环内重复连接时;编译器无法轻松优化它。