我理解String和StringBuilder之间的区别(StringBuilder是可变的),但两者之间有很大的性能差异吗?
我正在工作的程序有很多case驱动的字符串追加(500+)。使用StringBuilder是更好的选择吗?
我理解String和StringBuilder之间的区别(StringBuilder是可变的),但两者之间有很大的性能差异吗?
我正在工作的程序有很多case驱动的字符串追加(500+)。使用StringBuilder是更好的选择吗?
当前回答
字符串Vs字符串生成器:
你要知道的第一件事是这两个类生活在哪个汇编中?
So,
字符串出现在系统命名空间中。
and
StringBuilder出现在系统中。文本名称空间。
对于字符串声明:
您必须包括System名称空间。 就像这样。 使用系统;
and
对于StringBuilder声明:
你必须包括系统。文本名称空间。 就像这样。 使用text;
现在真正的问题来了。
string和StringBuilder之间的区别是什么?
两者的主要区别在于:
字符串是不可变的。
and
StringBuilder是可变的。
现在让我们讨论一下immutable和mutable的区别
Mutable::意思是可变的。
Immutable::表示不可更改。
例如:
using System;
namespace StringVsStrigBuilder
{
class Program
{
static void Main(string[] args)
{
// String Example
string name = "Rehan";
name = name + "Shah";
name = name + "RS";
name = name + "---";
name = name + "I love to write programs.";
// Now when I run this program this output will be look like this.
// output : "Rehan Shah RS --- I love to write programs."
}
}
}
在这种情况下,我们要将同一个对象改变5次。
所以显而易见的问题是!当我们修改同一个字符串5次时,实际上发生了什么。
这就是当我们改变同一个字符串5次时发生的情况。
让我们看一下图表。
解释:
当我们第一次将变量name初始化为Rehan时i-e string name = "Rehan" 这个变量被创建在堆栈“name”上,并指向“Rehan”值。 "name = name + "Shah"。引用变量不再指向对象“Rehan”,而是指向“Shah”,以此类推。
string是不可变的意思是一旦我们在内存中创建了对象我们就不能改变它们。
因此,当我们连接name变量时,前一个对象仍然在内存中,另一个新的字符串对象被创建。
所以从上图中我们有五件物品,四件物品被扔掉了,它们根本不用。它们仍然保留在内存中,并占据一定的内存容量。 “垃圾回收器”负责清理内存中的资源。
在字符串的情况下,当我们反复操作字符串时我们有很多对象被创建并留在内存中。
这就是字符串变量的故事。
现在让我们看看StringBuilder对象。 例如:
using System;
using System.Text;
namespace StringVsStrigBuilder
{
class Program
{
static void Main(string[] args)
{
// StringBuilder Example
StringBuilder name = new StringBuilder();
name.Append("Rehan");
name.Append("Shah");
name.Append("RS");
name.Append("---");
name.Append("I love to write programs.");
// Now when I run this program this output will be look like this.
// output : "Rehan Shah Rs --- I love to write programs."
}
}
}
在这种情况下,我们要将同一个对象改变5次。
所以显而易见的问题是!当我们修改同一个StringBuilder 5次时,实际上发生了什么。
这就是当我们修改同一个StringBuilder 5次时所发生的情况。
让我们看一下图表。
解释: 对于StringBuilder对象。你不会得到新对象。同一个对象会在内存中发生变化,所以即使你改变对象10000次,我们仍然只有一个stringBuilder对象。
你没有很多垃圾对象或非_referenced stringBuilder对象,因为它可以被更改。它是可变的意思是它会随着时间变化?
差异:
字符串存在于系统命名空间中,其中Stringbuilder存在 在系统。文本名称空间。 string是不可变的,而StringBuilder是可变的。
其他回答
从内存的角度来看,StringBuilder的性能会更好。至于处理,执行时间的差异可以忽略不计。
是的,性能差异是显著的。请参阅KB文章“如何在Visual c#中提高字符串连接性能”。
我总是试着先编写清晰的代码,然后再优化性能。这比反过来做要容易得多!但是,看到了两者在我的应用程序中的巨大性能差异后,我现在更仔细地考虑了一下。
幸运的是,在代码上运行性能分析相对简单,可以看到您在哪些地方花费了时间,然后在需要的地方修改它以使用StringBuilder。
StringBuilder减少了分配和赋值的数量,代价是使用了额外的内存。如果使用得当,它可以完全消除编译器需要一遍又一遍地分配越来越大的字符串,直到找到结果为止。
string result = "";
for(int i = 0; i != N; ++i)
{
result = result + i.ToString(); // allocates a new string, then assigns it to result, which gets repeated N times
}
vs.
String result;
StringBuilder sb = new StringBuilder(10000); // create a buffer of 10k
for(int i = 0; i != N; ++i)
{
sb.Append(i.ToString()); // fill the buffer, resizing if it overflows the buffer
}
result = sb.ToString(); // assigns once
以“微优化剧场的悲剧”为例。
The performance of a concatenation operation for a String or StringBuilder object depends on how often a memory allocation occurs. A String concatenation operation always allocates memory, whereas a StringBuilder concatenation operation only allocates memory if the StringBuilder object buffer is too small to accommodate the new data. Consequently, the String class is preferable for a concatenation operation if a fixed number of String objects are concatenated. In that case, the individual concatenation operations might even be combined into a single operation by the compiler. A StringBuilder object is preferable for a concatenation operation if an arbitrary number of strings are concatenated; for example, if a loop concatenates a random number of strings of user input.
来源:MSDN