删除vs新实例

时间:2010-11-23 13:21:05

标签: .net stringbuilder

我想知道在包含Remove方法的类实例的一般.NET编程中有什么更好的做法。

问题是: 如果我有一个带有一些数据的StringBuilder sb,使用.Remove(0,sb.Length)是否更聪明,或者创建一个新实例并将旧版本保留给GC进行收集。我知道有很多因素,所以我想知道你对这个因素的看法。

谢谢,

三晋

3 个答案:

答案 0 :(得分:2)

我肯定会创建一个新实例,直到探查器显示这是您应用程序中最关键的部分。

这种微优化类型的重用只会让任何读者都对代码的意图感到困惑。

答案 1 :(得分:2)

通常,创建一个新的。

.NET内存系统适用于快速创建和取消分配大量小型短期对象。 StringBuilder.Remove()可能会更慢。

对于非常大的数据(超过80kB),规则会有一些变化,具体取决于很多因素。

答案 2 :(得分:1)

请勿使用.Remove(0, sb.Length)使用.Clear()。它更容易阅读,如果没有为此特殊用例优化删除,Clear也会更快。
或者只是分配一个新的StringBuilder。 StringBuilder本身很轻巧,所以我不认为使用新的会很贵 我通常不会区分Clear()并根据一个的性能优势分配新的StringBuilder,但是会在其上创建更好的可读代码。这取决于您的用例。除非您的分析师证明有必要,否则不要进行微观优化 根据我的经验,您在某个方法的开头分配一个新的StringBuilder,并在生成函数的返回值时仅调用ToString。在这种情况下,复制函数接口只是为了重用StringBuilder是愚蠢的。

我认为当你调用ToString()时,StringBuilder会发出它的内部信息,所以内部缓冲区变得不可变,而StringBuilder需要在下一次更改时分配一个新的。

如果您确切地知道(或至少是下限)结果将持续多长时间,那么一个有用的微优化就是将容量传递给StringBuilder的构造函数。然后它不必以多个步骤增长数组。例如,如果您知道输出将至少为10000个字符,则可以将构建器初始化为10000个容量。