我知道這個問題has已被done但我有一個稍微不同的扭曲。有幾位已經指出,這是過早的優化,如果我只是爲了實用性和實用性的緣故而這是完全正確的。我的問題植根於實際問題,但我仍然很好奇。在C#中使用字符串連接的字符串連接
我創建了一堆SQL語句來創建一個腳本(如它將被保存到磁盤)來重新創建一個數據庫模式(容易很多很多的數百個表,視圖等)。這意味着我的字符串連接是僅附加的。根據MSDN,StringBuilder通過保留內部緩衝區(當然是char [])和將字符串複製到它中,根據需要重新分配數組來工作。但是,我的代碼有很多重複字符串(「CREATE TABLE [」,「GO \ n」等),這意味着我可以利用它們的優勢being interned,但如果我使用StringBuilder,因爲它們會被複制,所以不能使用它們每一次。唯一的變量基本上是表名,並且這些變量已經作爲已存在於內存中的其他對象中的字符串存在。
所以據我所知,我的數據讀入後,我的對象創建了保存架構信息,然後我所有的字符串信息都可以通過實習來重用,是的?
假設,那麼不會更快的List或LinkedList的字符串,因爲它們保留指向interned字符串的指針?那麼對於整個字符串的單個內存分配而言,只有一次調用String.Concat(),該分配恰好是正確的長度。
一個列表將不得不重新分配的String []實習指針和鏈表必須創建節點和修改指針,所以它們不是「免費」的事,但如果我串聯成千上萬的實習字符串,那麼他們會覺得他們會更有效率。
現在,我想我能想出的字符計數啓發式每個SQL語句&統計每個類型,並得到一個粗略的想法,並預先設定的我的StringBuilder的能力,以避免重新分配它的char [],但我不得不衝以公平的幅度減少重新分配的可能性。
因此,對於這種情況下,這將是最快的得到一個連接字符串:
- 的StringBuilder
- 列表<串實習串
- 的LinkedList <串>實習串>
- 具有容量啓發式的StringBuilder
- 還有其他的東西嗎?
作爲單獨的問題(我可能不會經常去盤)以上:將單一的StreamWriter輸出文件更快了嗎?或者,使用List或LinkedList,然後將它們從列表中寫入文件,而不是先在內存中連接。
編輯: 根據要求,the reference(.NET 3.5)到MSDN。它說:「如果有空間可用,新數據被追加到緩衝區的末尾;否則,分配一個新的,更大的緩衝區,來自原始緩衝區的數據被複制到新緩衝區,然後新數據被追加到新緩衝區「。對我來說,這意味着一個char [],它可以讓它變大(這需要將舊數據複製到調整大小的數組),然後追加。
這聽起來像是不成熟的優化。是否需要比字符串生成器的性能更好? – kevindaub 2009-05-02 21:08:30
如果你正在編寫一個程序來複制數據庫模式,並且你正在研究字符串連接的性能,那麼你應該重新考慮你的優先級。 – 2009-05-02 22:50:31
是啊,我不是新來的遊戲,我明白過早的優化和優先事項(至少還有其他一些事情)。儘管如此,我並不是要求提供建議。 :)雖然這個問題根植於一個實際問題,但我並沒有嚴格要求實用性。這就是說:你能回答這個問題嗎? – 2009-05-02 23:21:48