StringBuilder.Append 与 StringBuilder.AppendFormat

2023-12-28

我想知道 StringBuilder 的情况,并且有一个问题希望社区能够解释。

让我们忘记代码的可读性,其中哪一个是faster为什么?

StringBuilder.Append:

StringBuilder sb = new StringBuilder();
sb.Append(string1);
sb.Append("----");
sb.Append(string2);

StringBuilder.AppendFormat:

StringBuilder sb = new StringBuilder();
sb.AppendFormat("{0}----{1}",string1,string2);

不知道大小就没法说string1 and string2.

随着电话AppendFormat http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.appendformat.aspx,它将在给定格式字符串和将插入的字符串的长度的情况下预分配缓冲区一次,然后连接所有内容并将其插入缓冲区。对于非常大的字符串,这比单独调用更有优势Append http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.append.aspx这可能会导致缓冲区扩展多次。

然而,这三个呼吁Append可能会也可能不会触发缓冲区的增长,并且每次调用都会执行该检查。如果字符串足够小并且不会触发缓冲区扩展,那么它将比调用更快AppendFormat因为它不必解析格式字符串来找出在哪里进行替换。

需要更多数据才能得出明确答案

应该注意的是,很少有关于使用静态的讨论Concat方法上的String class http://msdn.microsoft.com/en-us/library/system.string.concat.aspx (乔恩的回答 https://stackoverflow.com/questions/710504/stringbuilder-append-vs-stringbuilder-appendformat/710659#710659 using AppendWithCapacity让我想起了这一点)。他的测试结果表明这是最好的情况(假设您不必利用特定的格式说明符)。String.Concat做同样的事情,因为它将预先确定要连接的字符串的长度并预分配缓冲区(由于通过参数进行循环构造,因此开销稍多)。它的性能将与乔恩的性能相当AppendWithCapacity method.

或者,只是简单的加法运算符,因为它编译为对String.Concat无论如何,需要注意的是所有添加都在同一个表达式中:

// One call to String.Concat.
string result = a + b + c;

NOT

// Two calls to String.Concat.
string result = a + b;
result = result + c;

对于所有发布测试代码的人

您需要在中运行您的测试用例separate运行(或者至少在单独测试运行的测量之间执行 GC)。这样做的原因是,如果你确实说,运行 1,000,000 次,就会创建一个新的StringBuilder http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx在一个测试的循环的每次迭代中,然后运行循环相同次数的下一个测试,创建一个额外的1,000,000StringBuilder在某些情况下,GC 很可能会在第二次测试期间介入并阻碍其时间安排。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

StringBuilder.Append 与 StringBuilder.AppendFormat 的相关文章

随机推荐