编辑长字符串时,字符串与StringBuilder

本文关键字:字符串 StringBuilder 编辑 | 更新日期: 2023-09-27 18:21:24

我有一个字符串,我必须编辑很多。长度未定义。Replace(string, string)将是最常用的方法。

什么是更好的string.Replace("", "")StringBuilder.Replace("", "")

public static string FormatMyString(string input)
{
    // ...
}

(代码示例简单而愚蠢。它们只是为了向你展示我在做什么。我总是会遇到问题:"你想做什么?")

编辑长字符串时,字符串与StringBuilder

什么是更好的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会表现得更好,但除非我测量它,否则我不会知道这一点。

在我们说出什么是最好的之前,您需要提供更多关于您正在运行的代码以及您所说的"更好"(更快、内存更少、易于阅读的代码等)的详细信息。