2014-09-11 88 views
0

我有一個字符串,我必須編輯很多。長度未定義。 Replace(string, string)將是最常用的方法。字符串與StringBuilder編輯長字符串時?

有什麼更好的string.Replace("", "")StringBuilder.Replace("", "")

public static string FormatMyString(string input) 
{ 
    // ... 
} 

(。中的代碼示例平原和愚蠢的他們只是服務宗旨向你展示我在做什麼,我總是得到的問題:「你想幹什麼?」)

+3

誰知道什麼是最好的?您需要爲「更好」定義您的標準,然後您必須將您的代碼與您的數據進行基準**。只有這樣你纔會知道。 – Enigmativity 2014-09-11 07:19:39

+0

檢出:http://stackoverflow.com/questions/6524528/string-replace-vs-stringbuilder-replace – Robban 2014-09-11 07:23:48

+0

編輯巨大字符串:http://en.wikipedia.org/wiki/Rope_(data_structure)。也許你將能夠找到充分的實施。 – 2014-09-11 07:25:17

回答

2

有什麼更好的string.Replace("", "")StringBuilder.Replace("", "")

都沒有。他們都沒有用處。在更一般的情況:

  • 如果你正在做一個替代的String.Replace內部呼叫應該如果你正在做很多替代品的考慮StringBuilder避免中間被罰款
  • 字符串
+1

但它仍然歸結爲實際對代碼進行基準測試以瞭解最佳結果。而且您必須比較內存使用情況,執行速度以及代碼可維護性,以作出最佳選擇。 – Enigmativity 2014-09-11 07:36:43

0

恕我直言字符串生成器是要走的路。

它具有創建成本,但由於更高效的字符串操作和串聯,通常會提供更好的性能。

正如我所說,有一個成本,所以你應該考慮什麼是「編輯相當多」的意思。

對不起,我不能提供實際的基準測試結果的權利,但我認爲使用字符串構建應該是非常低的門檻......

希望這有助於。

+0

「StringBuilder」執行速度並不一定正確。我剛剛測試了使用StringBuilder構建10,000,000個字符串與字符串連接,並且StringBuilder是** **的兩倍**。你**有**作爲基準來做出這樣的表述。 – Enigmativity 2014-09-11 07:34:47

0

對於這些事情,你只是「問」這個問題而沒有得到任何好的價值。你需要基準。拿這個代碼,例如:

var sw = Stopwatch.StartNew(); 
var cc0 = GC.CollectionCount(0); 
var s = (string)null; 
for (var i = 0; i < 10000000; i++) 
{ 
    s = "a"; 
    s += "b"; 
} 
var cc1 = GC.CollectionCount(0); 
sw.Stop(); 
Console.WriteLine(
    "collections == {0}, ms == {1}, string == \"{2}\"", 
    cc1 - cc0, 
    sw.ElapsedMilliseconds, 
    s); 

對戰驗證碼:

var sw = Stopwatch.StartNew(); 
var cc0 = GC.CollectionCount(0); 
var sb = (StringBuilder)null; 
for (var i = 0; i < 10000000; i++) 
{ 
    sb = new StringBuilder(); 
    sb.Append("a"); 
    sb.Append("b"); 
} 
var cc1 = GC.CollectionCount(0); 
Console.WriteLine(
    "collections == {0}, ms == {1}, string == \"{2}\"", 
    cc1 - cc0, 
    sw.ElapsedMilliseconds, 
    sb.ToString()); 

兩個結果我得到的是:

collections == 63, ms == 336, string == "ab" // += 
collections == 228, ms == 692, string == "ab" // StringBuilder 

StringBuilder接管長一倍,導致超過3.5倍更多的垃圾收集發生。

確實如此,如果我要連接很長的字符串,那麼StringBuilder將表現更好,但除非測量它,否則我不會知道這一點。

您需要提供更多關於您正在運行的代碼的細節,以及在我們可以說什麼是最好的之前,「更好」(更快,更少內存,易於閱讀代碼等)的含義。