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