簡體   English   中英

StringBuilder使用的內存多於字符串連接嗎?

[英]Does StringBuilder use more memory than String concatenation?

我知道使用StringBuilder的明顯性能優勢在於C#,但是內存差異是什么樣的呢?

StringBuilder是否使用更多內存? 作為一個附注,字符串構建器本質上做了哪些不同的事情,使它更快?

StringBuilder不一定更快。 我記得,如果你連接不到十幾個字符串,字符串連接(通過String.Concat或簡單的str1 + str2)實際上更快。 原因是StringBuilder的分配和初始化實際上需要時間。

StringBuilder更快的原因是它創建了一個內部緩沖區,它添加了字符串。 如果你連接20個字符串,StringBuilder只是一個接一個地附加到它的緩沖區,最后在請求時返回結果 - 通過它的ToString()方法。 (我假設有足夠的緩沖區空間。否則StringBuilder擔心重新分配緩沖區並具有啟發式幫助它不重新分配太多次。)如果你連接字符串,每個字符串concat將分配一個新的字符串length(str1.Length + str2.Length)並將第一個和第二個字符串復制到位。 這導致大量重新復制字符串。

var result = str1 + str2 + str3 + ... + strN;

這將需要N-1次分配和N-1次復制操作。 對於大N來說,這可能會非常昂貴。另外請注意,您要復制str1 N-1次的內容。 一旦得到str1 + str2的結果。 然后再次得到(str1 + str2)+ str3的結果。 使用StringBuilder,每個字符串僅復制到內部緩沖區一次,假設緩沖區足夠大以容納各個字符串。

簡短回答: StringBuilder適用於連接任意數量的字符串的情況,這些字符串在編譯時是您不知道的。

如果您確實知道在編譯時要組合的字符串, StringBuilder基本上沒有意義,因為您不需要其動態調整大小功能。

示例1:您想要組合“cat”,“dog”和“mouse”。 這正好是11個字符。 您可以簡單地分配一個長度為11的char[]數組,並用這些字符串中的字符填充它。 這基本上就是string.Concat所做的。

示例2:您希望將未指定數量的用戶提供的字符串連接到單個字符串中。 由於要連接的數據量事先是未知的,因此在這種情況下使用StringBuilder是合適的。

我想你真的應該讀到這個: 微優化劇場的悲劇悲劇 ,你對StringBuilder v / s Concat的回答,跳躍之后

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM