我一直在研究向我提出的一个问题:如何编写一个将字符串作为输入并返回字符之间有空格的字符串的函数。编写该函数以在每秒调用数千次时优化性能。
我知道 .net 有一个名为 的函数
String.Join
,我可以将空格字符作为分隔符与原始字符串一起传递给该函数。除非使用 ,否则
String.Join
我可以使用StringBuilder
该类在每个字符后附加空格。完成此任务的另一种方法是声明一个包含 2*n-1 个字符的字符数组(您必须为空格添加 n-1 个字符)。字符数组可以在循环中填充,然后传递给 String
constructor
。
我已经编写了一些 .net 代码,它们使用参数运行这些算法中的每一个一百万次,"Hello, World"
并测量执行所需的时间。方法 (3) 比 (1) 或 (2) 快得多。
我知道(3)应该非常快,因为它避免了创建任何额外的字符串引用来进行垃圾收集,但在我看来,内置的 .net 函数(例如)String.Join
应该会产生良好的性能。为什么使用String.Join
比手工工作慢得多?
public static class TestClass
{
// 491 milliseconds for 1 million iterations
public static string Space1(string s)
{
return string.Join(" ", s.AsEnumerable());
}
//190 milliseconds for 1 million iterations
public static string Space2(string s)
{
if (s.Length < 2)
return s;
StringBuilder sb = new StringBuilder();
sb.Append(s[0]);
for (int i = 1; i < s.Length; i++)
{
sb.Append(' ');
sb.Append(s[i]);
}
return sb.ToString();
}
// 50 milliseconds for 1 million iterations
public static string Space3(string s)
{
if (s.Length < 2)
return s;
char[] array = new char[s.Length * 2 - 1];
array[0] = s[0];
for (int i = 1; i < s.Length; i++)
{
array[2*i-1] = ' ';
array[2*i] = s[i];
}
return new string(array);
}
更新:我已将我的项目更改为“发布”模式,并相应地更新了我在问题中的经过时间。