编辑长字符串时,字符串与StringBuilder
本文关键字:字符串 StringBuilder 编辑 | 更新日期: 2023-09-27 18:21:24
我有一个字符串,我必须编辑很多。长度未定义。Replace(string, string)
将是最常用的方法。
什么是更好的string.Replace("", "")
或StringBuilder.Replace("", "")
public static string FormatMyString(string input)
{
// ...
}
(代码示例简单而愚蠢。它们只是为了向你展示我在做什么。我总是会遇到问题:"你想做什么?")
什么是更好的
string.Replace("", "")
或StringBuilder.Replace("", "")
?
两者都没有。他们俩都没做什么有用的事。在更普遍的情况下:
- 如果您正在进行一次替换,
String.Replace
的内部调用应该可以 - 如果要进行大量替换,请考虑
StringBuilder
以避免中间字符串
IMHO字符串生成器是一种方法。
它有创建成本,但由于更有效的字符串操作和连接,它通常会提供更好的性能。
正如我所说,这是有成本的,所以你应该考虑"大量编辑"是什么意思。
很抱歉,我现在不能提供实际的基准测试结果,但我认为使用字符串生成器的阈值应该很低。。。
希望这能有所帮助。
仅仅"询问"这类事情并没有得到任何好的价值。您需要进行基准测试。以这个代码为例:
var sw = Stopwatch.StartNew();
var cc0 = GC.CollectionCount(0);
var s = (string)null;
for (var i = 0; i < 10000000; i++)
{
s = "a";
s += "b";
}
var cc1 = GC.CollectionCount(0);
sw.Stop();
Console.WriteLine(
"collections == {0}, ms == {1}, string == '"{2}'"",
cc1 - cc0,
sw.ElapsedMilliseconds,
s);
对比此代码:
var sw = Stopwatch.StartNew();
var cc0 = GC.CollectionCount(0);
var sb = (StringBuilder)null;
for (var i = 0; i < 10000000; i++)
{
sb = new StringBuilder();
sb.Append("a");
sb.Append("b");
}
var cc1 = GC.CollectionCount(0);
Console.WriteLine(
"collections == {0}, ms == {1}, string == '"{2}'"",
cc1 - cc0,
sw.ElapsedMilliseconds,
sb.ToString());
我得到的两个结果是:
collections == 63, ms == 336, string == "ab" // +=
collections == 228, ms == 692, string == "ab" // StringBuilder
StringBuilder
占用的时间是原来的两倍,导致垃圾回收次数增加3.5倍以上。
当然,如果我连接很长的字符串,StringBuilder
会表现得更好,但除非我测量它,否则我不会知道这一点。
在我们说出什么是最好的之前,您需要提供更多关于您正在运行的代码以及您所说的"更好"(更快、内存更少、易于阅读的代码等)的详细信息。