当前位置: 首页 > 知识库问答 >
问题:

多重StringBuilder。追加通话与单一通话。用内部字符串concat追加

翟志新
2023-03-14

使用字符串生成器时的最佳实践是什么。NET关于的多个调用。追加方法与单个调用。在连接其参数时追加?

sb.Append(name).Append("; ");

vs.

sb.Append(name + "; ");

当使用一个而不是另一个时,会有任何性能损失吗?第二个变体在某些情况下可能更易读(并且更短)。

对短字符串进行这样简单的字符串串联会抵消使用字符串生成器的性能/内存增益吗?

共有2个答案

魏翔
2023-03-14

第二种方法比第一种方法慢(尽管可以说没有太多,所以如果它有助于可读性,也不会造成伤害)。根据经验:使用string。格式化字符串。Concat如果合适,在循环中添加内容时使用StringBuilder

我使用这种方法做了一些性能测试:

var strings = Enumerable.Range(100000, 200000).Select(x => x.ToString()).ToArray();

var watch = new Stopwatch();
watch.Start();

for (var i = 0; i < 100000; ++i)
    // whatever method

var result = ...; // e.g. sb.ToString();
watch.Stop();

WriteResultToFile(result); // prevent optimizations
Console.WriteLine("Took: " + watch.ElapsedMilliseconds + "ms");

结果如下:

// Method 1: 39317ms
str += strings[i] + ", ";

// Method 2: 8ms
sb.Append(strings[i] + ", ");

// Method 3: 2ms
sb.Append(strings[i]);
sb.Append(", ");

// Method 4: 15ms
sb.Append(string.Format("{0}, ", strings[i]));

但是,如果要连接固定数量的字符串,请使用string。Concat,因为它能够预先确定结果长度,因此性能非常好。

孟翰海
2023-03-14

所以我做了一个测试,在一个循环中使用三种方法添加文本100,000次。

(1)

    text += "Hello" + i.ToString();

(2)

    sb0.Append("Hello" + i.ToString());

(三)

    sb1.Append("Hello");
    sb1.Append(i.ToString());

结果是(1)花了108,332毫秒,(2)花了18ms,(3)花了19ms。

因此,事实证明,简单的连接比连续两次调用字符串生成器要快得多。我怀疑这与垃圾收集有关,而不是构建字符串的实际速度。

底线是,只要字符串相对较小,就可以毫无困难地使用字符串连接。

 类似资料:
  • 问题内容: 可能是我正在分裂头发,但我想知道以下情况: 最好使用哪个? 我最好的意思是 任何方式 。 阅读这些内容后,其他帖子说案例3并不是最佳性能,其他案例1会以案例3结束,依此类推。 更具体。 例如,搁置一旁,如果必须维护他的代码,哪种风格更适合从其他程序员那里看到呢? 还是您认为哪种编程更有效? 否则您会认为速度更快等。 我不知道该如何表达。 像案例3这样的答案可能会更快,但是绝大多数程序员

  • 问题内容: 我有一个4个熊猫数据框的列表,其中包含我想合并为一个数据框的一天的报价数据。我无法理解concat在时间戳上的行为。请参阅以下详细信息: 使用我得到: 使用我得到: 注意使用时索引如何变化。为什么会发生这种情况,我将如何使用该方法来重现使用所获得的结果?(因为看上去快得多;每个循环24.6 ms,而每个循环3.02 s) 问题答案: 因此,您正在执行的操作是append和concat

  • append key value 返回新字符串值的长度。

  • 问题内容: 在每篇文章中,“如何向JEditorPane附加字符串?”问题的答案。就像 我已经试过了: 结果,我得到了“终止时间:1000”,而没有“进程的分布:” 为什么会发生这种情况??? 问题答案: 我怀疑这是附加文本的推荐方法。这意味着每次更改某些文本时,都需要重新解析整个文档。人们之所以这样做,是因为他们不了解如何使用JEditorPane。包括我在内。 我更喜欢使用JTextPane然

  • 我试图理解什么是最佳实践,以及为什么在不同情况下连接字符串文本和变量。例如,如果我有这样的代码 这样做吗?在这篇文章中,我注意到字符串上的操作符创建了一个新的StringBuilder实例,连接操作数,并返回字符串转换,这似乎比调用;如果这是真的,那就不可能了。但是字符串呢。concat()?使用用于每个连接?或者只针对变量,可以使用? 在这些情况下,最佳实践和绩效的一般规则是什么?我对的假设正确

  • 问题内容: 我有一个对象 现在,我想在末尾添加一个换行符。我该怎么做? 不起作用。因此,我正在考虑使用Unicode编写换行符。请问有帮助吗?如果是这样,我如何添加一个? 问题答案: 它应该是 但我建议您按照以下步骤做, 在Java中为您提供系统相关的换行符。同样从Java 7开始,有一个方法可以直接返回值: