对于这些事情,你只是“问”这个问题而没有得到任何好的价值。你需要基准。拿这个代码,例如:
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