2012-02-03 71 views

回答

9

是的,有:我跑了一个快速实验,看起来像字符串版本慢了大约3倍。

string a = "quickbrownfoxjumpsoverthelazydog"; 
    DateTime t1 = DateTime.Now; 
    for (int i = 0; i != 10000000; i++) { 
     var b = a.Replace('o', 'b'); 
     if (b.Length == 0) { 
      break; 
     } 
    } 
    DateTime t2 = DateTime.Now; 
    for (int i = 0; i != 10000000; i++) { 
     var b = a.Replace("o", "b"); 
     if (b.Length == 0) { 
      break; 
     } 
    } 
    DateTime te = DateTime.Now; 
    Console.WriteLine("{0} {1}", t2-t1, te-t2); 

1.466s VS 4.583s

这并不奇怪,因为用绳子超载需要额外的循环要经过oldString的所有字符。该循环只运行一次,但开销仍然存在。

+0

感谢您的测试计划! – Laguna 2012-02-03 14:23:27

+1

+1出于兴趣,是否有人能够对System.String.ReplaceInternal的重载进行逆向工程?我有兴趣看看Dev是否在char超载上观察到了不变性:) – StuartLC 2012-02-03 14:27:02

5

我会预计string.Replace(char, char)可能会更快,因为它可以分配恰到好处的空间。不过,我怀疑它会在许多真实世界的应用程序中产生显着的性能差异。

更重要的是,我会说它更具可读性 - 更清晰的是,你最终会得到一串相同长度的字符串。

3

String.Replace(char, char)更快。原因很简单:

  • 字符替换并不需要分配一个字符串具有不同的尺寸,字符串替换需要找出新的规模第一,或者使用StringBuilder用于替换
  • 字符替换不需要使用一系列字符串进行检查。想象一下你有一个像ABCACABCAC这样的字符串,并且你想替换ABC。你需要找出3个字符是否匹配,当使用字符时,你只需要找到一个字符。
相关问题