出于好奇(不是真的期待可衡量的结果),以下哪些代码在性能方面更好?
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在两种变体中生成相同的代码?)
答案 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
将始终产生相同数量的字符例如。
在替换本身的表现并不重要。在紧密循环中,“旧”字符串的分配和垃圾收集将比替换本身产生更大的影响。