【发布时间】:2010-09-21 21:36:35
【问题描述】:
以下 C# 代码需要 5 分钟才能运行:
int i = 1;
string fraction = "";
while (fraction.Length < 1000000)
{
fraction += i.ToString();
i++;
}
像这样“优化它”会导致它在 1.5 秒内运行:
int i = 1;
string fraction = "";
while (fraction.Length < 1000000)
{
// concatenating strings is much faster for small strings
string tmp = "";
for (int j = 0; j < 1000; j++)
{
tmp += i.ToString();
i++;
}
fraction += tmp;
}
编辑: 有人建议使用StringBuilder,这也是一个很好的建议,0.06 秒就出来了:
int i = 1;
StringBuilder fraction = new StringBuilder();
while (fraction.Length < 1000000)
{
fraction.Append(i);
i++;
}
寻找j 的最佳值是另一个话题,但为什么这种不明显的优化效果如此好?另外,在一个相关的话题上,我听说你永远不应该在字符串中使用+ 运算符,而是使用string.Format(),这是真的吗?
【问题讨论】:
-
有趣,我想知道使用 System.Text.StringBuilder 需要多长时间,但我太累了,无法启动虚拟机,收藏(如果这是一个词)
-
检查一下,我现在已经完成了 StringBuilder 测试。它比我的内部循环慢,但仍然比原始代码快得多。
-
请注意,StringBuilder 将可选的初始容量作为其参数!这应该会快得多。
-
实际上,在这个例子中使用它几乎没有实际区别。
-
当你测试字符串生成器调用 Append(i);
标签: c# string optimization performance