2010-11-23 74 views
1

我想知道什么是更好的做法是一般的.NET编程与包含Remove方法的类实例。删除VS新实例

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

感谢,

三晋

+0

您将得到两个答案,但您只是没有提供足够的详细信息。像.NET版本一样,.NET 4.0的StringBuilder有很大的变化。 – 2010-11-23 14:38:21

回答

2

一般来说,创建一个新的。

.NET内存系统专门用于快速创建和取消分配大量小而短暂的对象。 StringBuilder.Remove()可能会变慢。

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

+0

特别是因为`Remove`可能无法识别(我没有看到源代码),您将删除整个缓冲区,并因此最终放入一个未经优化的代码路径中,该代码路径旨在从字符串中移除。当然删除是难以阅读 – CodesInChaos 2010-11-23 14:00:16

+0

我认为这是我需要的信息:)数据大小是一个完美的参考^ _ ^谢谢 – 2010-11-23 14:45:28

2

我肯定会去创建一个新的实例,直到探查表明,这是你的应用程序中最关键的部分。

这种微型优化类型的重用只是混淆了任何读者对代码的意图。

1

请勿使用.Remove(0, sb.Length)改为使用.Clear()。它更容易阅读,如果Remove没有针对这种特殊使用情况进行优化,Clear也会更快。
或者只是分配一个新的StringBuilder。 StringBuilder本身很轻便,所以我不认为使用新的将会很昂贵。
我通常不会区分Clear()并根据其中一个的性能优势分配一个新的StringBuilder,但它会创建更好的可读代码。这取决于你的用例。不要微观优化,除非你的配置文件已经表明它是必要的。
根据我的经验,您在某些方法的开始处分配了一个新的StringBuilder,并且在生成函数的返回值时仅调用ToString。在这种情况下,为了重用StringBuilder而使函数接口复杂化是很愚蠢的。

而且我认为当你调用ToString()时,StringBuilder会给出它的内部变量,所以内部缓冲区变得不可变,并且StringBuilder需要为下一个变更分配一个新的变量。

如果你确切地知道(或者至少有一个下界),结果将会是多长时间,一个可能有用的微型优化是将一个容量传递给StringBuilder的构造函数。然后它不需要通过多个步骤来增长数组。例如,如果您知道输出至少10000个字符,则可以将构建器初始化为10000的容量。