[英]Are string concatenations using + optimized to a StringBuilder implementation in .NET?
我已经阅读了多个地方,在Java 1.5+中,在编译程序时,将String
连接优化为使用StringBuilder
。 我不清楚这是许多编译器采用的是标准还是只是常见的优化。 对此的任何澄清将不胜感激,但主要是我的第二个问题的引导。
.NET是否同样进行了优化? 我知道,如果我使用StringBuilder
这将消除任何歧义,但是我个人觉得+
简单易读。 如果是.NET,它是否从特定版本开始? 详尽的赞赏。
从MSDN:
字符串对象串联操作始终根据现有字符串和新数据创建一个新对象。 StringBuilder对象维护一个缓冲区以容纳新数据的串联。 如果有可用空间,则将新数据附加到缓冲区; 否则,将分配一个更大的新缓冲区,将原始缓冲区中的数据复制到新缓冲区中,并将新数据附加到新缓冲区中。
String或StringBuilder对象的串联操作的性能取决于内存分配的频率。 String串联操作始终分配内存,而StringBuilder串联操作仅在StringBuilder对象缓冲区太小而无法容纳新数据时分配内存。 如果要串联固定数量的String对象,请使用String类。 在这种情况下,编译器甚至可以将单个串联操作组合为一个操作。 如果要串联任意数量的字符串,请使用StringBuilder对象。 例如,如果您使用循环来连接随机数量的用户输入字符串。
http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx
希望这可以使您对StringBuilder有更好的了解,然后再使用+
性能考量
字符串对象串联操作始终根据现有字符串和新数据创建一个新对象。 StringBuilder对象维护一个缓冲区以容纳新数据的串联。 如果有可用空间,则将新数据附加到缓冲区; 否则,将分配一个更大的新缓冲区,将原始缓冲区中的数据复制到新缓冲区中,并将新数据附加到新缓冲区中。
String或StringBuilder对象的串联操作的性能取决于内存分配的频率。 String串联操作始终分配内存,而StringBuilder串联操作仅在StringBuilder对象缓冲区太小而无法容纳新数据时分配内存。 如果要串联固定数量的String对象,请使用String类。 在这种情况下,编译器甚至可以将单个串联操作组合为一个操作。 如果要串联任意数量的字符串,请使用StringBuilder对象。 例如,如果您使用循环来连接随机数量的用户输入字符串。
不,AFAIK .NET不会自动执行此操作,您需要具体说明。 每次使用+
都会创建一个新字符串,因为类型字符串是不可变的。
我建议例如阅读以下内容: 连接字符串的最有效方法?
Hint
-接受的答案可能并不总是正确的答案。
这是: http : //en.csharp-online.net/Manipulating_Strings_in_CSharp%E2%80%94Concatenating_Strings
不,+运算符未在.NET中使用StringBuilder进行优化。 在MSDN中,有一个类似的提法,如果您想加快字符串操作的速度,可以使用StringBuilder
如果使用String.Concat
在一个操作中连接多个字符串,则.net会将它们的长度加在一起,创建一个大小合适的新字符串对象,并将所有字符从源字符串复制到新字符串中。 如果在String.Concat
调用中使用四个或更少的字符串,则将创建一个新对象(新字符串);否则,将创建一个新对象。 除非其中一个旧字符串被丢弃并因此变成垃圾,否则不会创建“垃圾”。 如果连接五个或更多字符串,将创建一个新的临时String[]
来保存参数,但是它很小且寿命短(因此相对无害),与字符串的长度无关,除非您传递成千上万的参数。
另外,可以使用C#中的+
运算符或vb.net中的+
或&
运算符连接任意数量的常量字符串,编译器会将它们转换为一个更大的常量字符串。 我不确定是什么规则决定了C#或vb.net编译器将合并包含多个常量和非常量字符串的表达式中的字符串的程度(尤其是如果包含括号); 使用String.Concat
调用并根据需要使用尽可能多的参数,但在任何情况下使用+
合并参数中的常量字符串,都应产生最佳代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.