2014-09-11 53 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将表现更好,但除非测量它,否则我不会知道这一点。

您需要提供更多关于您正在运行的代码的细节,以及在我们可以说什么是最好的之前,“更好”(更快,更少内存,易于阅读代码等)的含义。