繁体   English   中英

删除与新实例

[英]Remove vs New Instance

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

问题是:如果我有一个包含一些数据的StringBuilder sb,使用.Remove(0,sb.Length)还是创建一个新实例并将旧实例留给GC收集是否更聪明? 我知道很多因素,因此我想了解您对此的看法。

谢谢,

三进

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

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

通常,创建一个新的。

.NET内存系统旨在快速创建和取消分配许多小的短期对象。 StringBuilder.Remove()可能会更慢。

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

不要使用.Remove(0, sb.Length) .Clear()而是使用.Clear() 它更易于阅读,并且如果尚未针对此特殊用例对Remove进行优化,那么Clear也会更快。
或者只是分配一个新的StringBuilder。 StringBuilder本身很轻巧,因此我认为使用新的不会昂贵。
我通常不会区分Clear()并基于一个的性能优势分配一个新的StringBuilder,但是在此基础上会创建更好的可读性代码。 这取决于您的用例。 除非您的分析器表明有必要,否则请不要进行微优化。
以我的经验,您在某些方法的开头分配了一个新的StringBuilder,并且仅在生成函数的返回值时才调用ToString 在那种情况下,仅仅重复使用StringBuilder会使函数接口复杂化是愚蠢的。

而且我认为,当您调用ToString() ,StringBuilder会发出它的内部信息,因此内部缓冲区变得不可变,并且StringBuilder仍然需要为下一个更改分配一个新值。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM