對於這些事情,你只是「問」這個問題而沒有得到任何好的價值。你需要基準。拿這個代碼,例如:
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
將表現更好,但除非測量它,否則我不會知道這一點。
您需要提供更多關於您正在運行的代碼的細節,以及在我們可以說什麼是最好的之前,「更好」(更快,更少內存,易於閱讀代碼等)的含義。
誰知道什麼是最好的?您需要爲「更好」定義您的標準,然後您必須將您的代碼與您的數據進行基準**。只有這樣你纔會知道。 – Enigmativity 2014-09-11 07:19:39
檢出:http://stackoverflow.com/questions/6524528/string-replace-vs-stringbuilder-replace – Robban 2014-09-11 07:23:48
編輯巨大字符串:http://en.wikipedia.org/wiki/Rope_(data_structure)。也許你將能夠找到充分的實施。 – 2014-09-11 07:25:17