只是出于好奇(并不是真正期望可测量的结果)以下哪些代码在性能方面更好?
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 在两种变体中生成相同的代码?)
如果您有两匹马并且想知道哪匹马更快......
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 倍
如果不测试代码,我们就无法确定,因为大部分替换都是在 CLR 内部完成的,并且经过了大量优化。
我们可以说的是:替换
char
具有一些性能优势,因为代码更简单并且结果更可预测:例如,替换 char
将始终产生与原始字符数相同的字符。
在性能上更换本身并没有太大关系。在紧密循环中,“旧”字符串的分配和垃圾回收将比替换本身产生更大的影响。
我为任何最终会来到这里的人制定了一个简单的基准。
方法 | 意思是 | 错误 | 标准偏差 |
---|---|---|---|
替换字符 | 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;
}