簡體   English   中英

StringBuilder是否比連接十幾個字符串慢?

[英]Is it true that StringBuilder is slower than concatenate a dozen of strings?

StringBuilder是否比連接十幾個字符串慢? 編譯器如何優化字符串連接,以便使用“+”連接十幾個字符串將比StringBuilder更好?

從一本書(Ben Watson編寫)中可以看出:

字符串連接:對於已知(在編譯時)數量的字符串的簡單連接,只需使用'+'運算符或String.Concat方法。 這通常比使用StringBuilder更有效。 string result = a + b + c + d + e + f; 在字符串數量可變且可能大於幾十個之前,不要考慮StringBuilder。 編譯器將以減少內存開銷的方式優化簡單字符串連接。

String.Concat更有效,因為它從一開始就知道所有的字符串長度。 因此它可以分配一個具有恰當長度的緩沖區,將字符串復制到其中並返回該緩沖區。

StringBuilder必須分配一個小緩沖區,每次調用Append都會重新分配和復制它會導致空間不足。 ToString()的最后調用還必須分配另一個緩沖區。

所以當你事先知道你有多少個字符串時,請使用String.Concat ; 如果不這樣做,請使用StringBuilder

在C#中,對+運算符的鏈式調用會自動轉換為對String.Concat的單個調用。

直接連接需要較少的對象和內存調用。 所以如果你在一個語句中連接所有字符串(沒有任何文本處理),它會更快。

在這種情況下,編譯器可以計算新字符串的大小並分配內存並將所有字符復制到其中。 因此,您只創建所需的對象。

如果您使用的是StringBuilder,則使用其他對象。 如果附加長字符串而不告訴構造函數中的StringBuilder使用巨大的緩沖區大小,則字符串構建器可能會執行多個內存分配和副本,因為它可能會在標准內存分配上運行多次。

如果在循環中構建字符串,StringBuild是更好的解決方案。 在這種情況下,直接連接將在每次​​迭代中創建一個新對象和內存分配,其中StringBuild僅使用一個內存分配(如果在構造函數中使用正確的值)並且僅使用兩個對象。

但很難說出運行時的某些內容。 實施隨時間而變化。 那么現在最好的做法可能是5年來最糟糕的做法。

暫無
暫無

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

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