【发布时间】:2013-06-05 19:24:22
【问题描述】:
下面是我可以创建的用于反转字符串的最快代码
public static void ReverseFast(string x)
{
string text = x;
StringBuilder reverse = new StringBuilder();
for (int i = text.Length - 1; i >= 0; i--)
{
reverse.Append(text[i]);
}
Console.WriteLine(reverse);
}
我想解决这个等式中的每个瓶颈,以使其尽可能快。到目前为止,我唯一能找到的是我只部分理解的 Array Bounds 检查。如果您使用.Length,编译器决定不检查边界,但如果您像我在for 循环中那样递减,它仍然会进行边界检查,是否有任何方法可以禁用它?有人可以将其转换为使用指针来避免边界检查吗,我想测试 100k+ 个字符范围内的字符串的速度差异。
根据下面的 cmets 和帖子,这是我迄今为止提出的。
public static void ReverseFast(string x)
{
StringBuilder reverse = new StringBuilder(x.Length);
for (int i = x.Length - 1; i >= 0; i--)
{
reverse.Append(x[i]);
}
Console.WriteLine(reverse);
}
上述解决方案比建议的重复问题答案要快得多。这个问题实际上是在解决 5000 * 26 个字符 + 范围内的反转问题。我仍然想用指针来测试一下,看看是否没有瓶颈,尤其是在这么多字符的情况下。
【问题讨论】:
-
那不会成为你的瓶颈。说真的。
-
使用正确的长度 (text.Length) 初始化 StringBuilder - 这将防止调整缓冲区的大小。
-
我的问题是乞求探索 c# 中的指针替代方案并批评我目前的想法。
-
用
new StringBuilder(text.Length)替换new StringBuilder()应该可以消除所有不必要的内存[重新]分配。 -
This answer 在重复的问题中提供了带有指针的解决方案。不要停留在接受的答案上,看看所有的答案。虽然对于大字符串,您可能希望删除
stackalloc。