【发布时间】:2011-12-26 15:56:07
【问题描述】:
为什么StringBuilder 比 + 连接慢?
StringBuilder 是为了避免创建额外的对象,但为什么会影响性能?
static void Main(string[] args)
{
int max = 1000000;
for (int times = 0; times < 5; times++)
{
Console.WriteLine("\ntime: {0}", (times+1).ToString());
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < max; i++)
{
string msg = "Your total is ";
msg += "$500 ";
msg += DateTime.Now;
}
sw.Stop();
Console.WriteLine("String +\t: {0}ms", ((int)sw.ElapsedMilliseconds).ToString().PadLeft(6));
sw = Stopwatch.StartNew();
for (int j = 0; j < max; j++)
{
StringBuilder msg = new StringBuilder();
msg.Append("Your total is ");
msg.Append("$500 ");
msg.Append(DateTime.Now);
}
sw.Stop();
Console.WriteLine("StringBuilder\t: {0}ms", ((int)sw.ElapsedMilliseconds).ToString().PadLeft(6));
}
Console.Read();
}
编辑:按照建议移出范围变量:
【问题讨论】:
-
我认为 StringBuilder 对于“更大”的字符串更快。
-
添加string.Format和string.Concat,我们也注意到
string.Concat更快了 -
它几乎总是更快,除非你正在做一个简单的单一连接并且不值得额外的代码行。正如 NullUser 指出的那样,您在循环内部进行分配是错误的,并且会扭曲您的数字。
-
为什么每个人都会自动假设字符串连接是“慢”的?重复的字符串连接有一个“更糟糕的 Big-O”,但不要忘记
C并记住n:) 使用正确的工具来完成这项工作——这是我拉出 StringBuilder 的罕见日子. (另外,我不知道 C# 做了哪些优化,但 Java 可能在编译期间将+转换为等效的 StringBuilder 代码。) -
StringBuilder 旨在避免创建额外的对象 - 除非您出于某种未知原因在每次迭代中创建一个新的
StringBuilder...
标签: c# stringbuilder string-concatenation