String.Replace(char, char) 还是 Replace(string, string)?

13
当我只需要用另一个字符替换一个字符时,使用String.Replace(char, char)和String.Replace(string, string)有性能差异吗?
3个回答

11

是的,有一个结论:我进行了一项快速实验,结果看起来使用字符串版本大约慢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.466秒与4.583秒

这并不令人意外,因为使用字符串的负载需要额外循环遍历oldString的所有字符。这个循环只运行一次,但开销仍然存在。


1
有没有人能够反向工程 System.String.ReplaceInternal 的重载呢?我很想知道开发人员是否在 char 重载上观察到了不可变性 :) - StuartLC

6
我认为 string.Replace(char, char) 可能更快,因为它可以精确地分配所需的空间。不过在许多实际的应用程序中,这可能不会产生显著的性能差异。
更重要的是,我认为它更易读——更清楚地表明最终会得到一个相同长度的字符串。

3

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

  • 字符替换不需要使用具有不同大小的字符串进行分配,字符串替换需要首先查找新的大小或使用StringBuilder进行替换。
  • 字符替换不需要检查字符串的范围。想象一下你有一个字符串ABCACABCAC,你想要替换ABC,当使用字符时,你只需要找到一个字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接