所以我們被告知StringBuilder應該用在對字符串進行多次操作時(我聽說只有三次)。因此,我們應更換此:爲什麼StringBuilder比字符串操作更快,但列表<T>比LinkedList更快?
string s = "";
foreach (var item in items) // where items is IEnumerable<string>
s += item;
有了這個:
string s = new StringBuilder(items).ToString();
我認爲內部的StringBuilder保存到每個追加的字符串的引用,要求再結合。讓我們把它和HybridDictionary進行比較,HybridDictionary對前10個元素使用LinkedList,然後當列表增長超過10時,交換到HashTable。正如我們可以看到的那樣,少量的引用= linkedList,else使越來越多的陣列塊。
讓我們來看看List的工作原理。從列表大小開始(內部默認值爲4)。向內部數組添加元素,如果數組已滿,則創建一個新數組,將當前數組的大小加倍,將當前數組的元素複製,然後添加新元素,並將新數組作爲當前數組。
你能看到我對性能好處的困惑嗎?對於除字符串以外的所有元素,我們創建新數組,複製舊值並添加新值。但對於那些糟糕的字符串?因爲我們知道「a」+「b」從兩個舊引用「a」和「b」中創建新的字符串引用。
希望我的問題不是太混亂。爲什麼在字符串連接和數組連接之間似乎有雙重標準(我知道字符串是字符數組)?
字符串:使新的參考文獻不好!
T:其中T!=字符串:製作新引用很好!
編輯:也許我真的在這裏問,什麼時候創建新的,更大的數組和複製舊的值,開始比任意地將對象放在整個堆上的引用更快?通過更快的速度,我的意思是讀取,寫入和查找變量,而不是插入或刪除(例如,LinkedList會在插入時進行kickass,但我不關心這一點)。
最終編輯:我不在乎StringBuilder,我對將堆中的數據從堆的一部分複製到另一部分以緩存對齊所帶來的時間差異感到興趣, CPU,並在整個堆的參考。什麼時候一個變快那麼其他*
'StringBuilder'比'string'更接近'List'。 'StringBuilder'和'List '都預留了比所需內存更多的內存(參見容量和長度的區別)。 'String.Concat'很好,但;當您不知道要連接多少個字符串時,'StringBuilder'會更有用。 –
Ryan
你的例子很糟糕,''s =「a」+「b」+「c」+「d」;編譯器會將'string s =「abcd」;'一個更好的例子是'string s = a + b + c + d',其中'a'到'd'是計算變量。 –
@ScottChamberlain我知道,但如果你可以利用你的想象力,就問題的背景而言,那會很棒。 – user1515024