替换(char,char)或替换(String,String)

本文关键字:String 替换 char | 更新日期: 2023-09-27 18:22:38

当我只需要用另一个字符替换一个字符时,String.Replace(char,char)和String.Replect(String,String)之间有性能差异吗?

替换(char,char)或替换(String,String)

是的,有:我运行了一个快速实验,看起来字符串版本慢了大约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秒vs 4.583秒

这并不奇怪,因为字符串重载需要一个额外的循环来遍历oldString的所有字符。这个循环只运行一次,但开销仍然存在。

我预计string.Replace(char, char)可能会更快,因为它可以分配正确的空间量。不过,我怀疑它是否会在许多现实世界的应用程序中产生显著的性能差异。

更重要的是,我想说它更可读——更清楚的是,你最终会得到一个相同长度的字符串。

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

  • 字符替换不需要分配不同大小的字符串,字符串替换需要首先找到新的大小或使用StringBuilder进行替换
  • 字符替换不需要对字符串的范围进行检查。假设您有一个类似ABCACABCAC的字符串,并且您想要替换ABC。你需要找出3个字符是否匹配,当使用字符时,你只需要找到一个字符