【问题标题】:String vs. StringBuilder when editing a long string?编辑长字符串时的字符串与 StringBuilder?
【发布时间】:2014-11-05 01:02:49
【问题描述】:

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

string.Replace("", "") 或 StringBuilder.Replace("", "") 哪个更好?

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

(代码示例简单而愚蠢。它们只是为了向您展示我在做什么。我总是收到问题:“您要做什么?”) p>

【问题讨论】:

  • 谁知道什么是最好的?您需要定义“更好”的标准,然后您必须用您的数据对您的代码进行基准测试。只有这样你才会知道。
  • 用于编辑大字符串:en.wikipedia.org/wiki/Rope_(data_structure)。也许你能找到足够的实现。
  • String.replace("","") 替换后创建新字符串。根据您的标准,字符串长度未定义,因此请考虑内存字符串生成器比字符串更好。因为字符串生成器会更改现有字符串并且不会创建新字符串。两者都不是线程安全的。所以我们无法比较字符串和字符串生成器之间的执行速度
  • @Robban 抱歉,它没有出现在推荐的问题中。是的,我认为这很有帮助。

标签: c# string performance stringbuilder


【解决方案1】:

string.Replace("", "") 或 StringBuilder.Replace("", "") 哪个更好?

两者都没有。他们都没有做任何有用的事情。在更一般的情况下:

  • 如果你正在做一个替换,String.Replace 的内部调用应该没问题
  • 如果您要进行 大量 替换,考虑 StringBuilder 以避免中间字符串

【讨论】:

  • 但它仍然归结为实际对代码进行基准测试以了解什么是最好的。您必须比较内存使用情况、执行速度以及代码可维护性,才能做出最佳选择。
【解决方案2】:

恕我直言字符串生成器是要走的路。

它有创建成本,但由于更有效的字符串操作和连接,通常会提供更好的性能。

正如我所说,这是有成本的,因此您应该考虑“大量编辑”是什么意思。

抱歉,我现在无法提供实际的基准测试结果,但我认为使用 String Builder 的门槛应该很低...

希望这会有所帮助。

【讨论】:

  • StringBuilder 的执行速度不一定是正确的。我刚刚测试了使用 StringBuilder 与字符串连接构建 10,000,000 个字符串,StringBuilder 是 slow 的两倍。您必须进行基准测试以做出这样的陈述。
【解决方案3】:

只是“询问”这类事情并没有任何价值。您需要进行基准测试。以这段代码为例:

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 的性能肯定会更好,但除非我测量它,否则我不会知道这一点。

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

【讨论】:

    猜你喜欢
    • 2010-09-09
    • 2010-10-29
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多