簡體   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