性能字符串与字符串

时间:2016-04-20 08:22:36

标签: c# performance types

出于好奇(不是真的期待可衡量的结果),以下哪些代码在性能方面更好?

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在两种变体中生成相同的代码?)

2 个答案:

答案 0 :(得分:9)

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

  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 ms,String替换 500 ms(Core i5 3.2GHz,64位, .Net 4.6)。所以

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

9次更快

答案 1 :(得分:1)

在没有测试代码的情况下我们无法确定,因为大多数替换是在CLR内部完成的,并且进行了大量优化。

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

在替换本身的表现并不重要。在紧密循环中,“旧”字符串的分配和垃圾收集将比替换本身产生更大的影响。