性能字符与字符串

问题描述 投票:0回答:3

只是出于好奇(并不是真正期望可测量的结果)以下哪些代码在性能方面更好?

private void ReplaceChar(ref string replaceMe) {
  if (replaceMe.Contains('a')) {
    replaceMe=replaceMe.Replace('a', 'b');
  }
}

private void ReplaceString(ref string replaceMe) {
  if (replaceMe.Contains("a")) {
    replaceMe=replaceMe.Replace("a", "b");
  }
}

在第一个示例中,我使用 char,而在第二个示例中,我在 Contains() 和 Replace() 中使用字符串

第一个是否会因为消耗内存较少的“char”而具有更好的性能,或者第二个是否会性能更好,因为编译器不必在此操作中进行强制转换?

(或者这全是废话,因为 CLR 在两种变体中生成相同的代码?)

c# performance types char
3个回答
12
投票

如果您有两匹马并且想知道哪匹马更快......

  String replaceMe = new String('a', 10000000) + 
                     new String('b', 10000000) + 
                     new String('a', 10000000);

  Stopwatch sw = new Stopwatch();

  sw.Start();

  // String replacement 
  if (replaceMe.Contains("a")) {
    replaceMe = replaceMe.Replace("a", "b");
  }

  // Char replacement
  //if (replaceMe.Contains('a')) {
  //  replaceMe = replaceMe.Replace('a', 'b');
  //}

  sw.Stop();

  Console.Write(sw.ElapsedMilliseconds);

我更换 Char 需要

60
毫秒,更换 String 需要
500
毫秒(Core i5 3.2GHz,64 位,.Net 4.6)。所以

 replaceMe = replaceMe.Replace('a', 'b')

大约快 9 倍


1
投票

如果不测试代码,我们就无法确定,因为大部分替换都是在 CLR 内部完成的,并且经过了大量优化。

我们可以说的是:替换

char
具有一些性能优势,因为代码更简单并且结果更可预测:例如,替换
char
将始终产生与原始字符数相同的字符。

在性能上更换本身并没有太大关系。在紧密循环中,“旧”字符串的分配和垃圾回收将比替换本身产生更大的影响。


0
投票

我为任何最终会来到这里的人制定了一个简单的基准。

方法 意思是 错误 标准偏差
替换字符 7.915 纳秒 0.1725 纳秒 0.1694 纳秒
替换字符串 10.161 纳秒 0.2030 纳秒 0.1899 纳秒

代码:

    [Benchmark]
    public string ReplaceChar()
    {
        string replaceMe1 = "hello";

        replaceMe1.Replace('o', '0');

        return replaceMe1;
    }

    [Benchmark]
    public string ReplaceString()
    {
        string replaceMe2 = "hello";

        replaceMe2.Replace("o", "0");

        return replaceMe2;
    }
© www.soinside.com 2019 - 2024. All rights reserved.