我的代码在很大程度上依赖于String.Substring方法,直到Substring方法减慢了我的应用程序的速度。我知道我想要检索的范围是在字符串内(它不是超出范围。)是否有一些我可以使用而不是更快的子串?我可以编写自己的可以放弃任何边界检查的Substring方法吗?
示例代码:
public String get_element(int element_number) {
int count = 0;
int start_index = 0;
int end_index = 0;
int current_index = 0;
while (count < element_number && current_index != -1) {
current_index = line_text.IndexOf(x12_reader.element_delimiter, start_index);
start_index = current_index + 1;
count++;
}
if (current_index != -1) {
end_index = line_text.IndexOf(x12_reader.element_delimiter, start_index);
if (end_index == -1) end_index = line_text.Length;
return line_text.Substring(start_index, end_index - start_index); ;
} else {
return "";
}
}
我看到很多评论询问Substring是否真的是问题。我知道Substring是个问题。我在Visual Studio中运行了分析,它指出了Substring是罪魁祸首。此外,我不能比现在更少地调用此功能。我唯一要优化的地方是Substring函数。我知道情况就是这样。
答案 0 :(得分:1)
你的函数的问题是你要返回子字符串...因此,我没有看到避免构造新字符串的方法。
接下来的问题是你究竟在做什么?也许您可以更改get_element
方法的签名,例如接收StringBuilder
然后从目标字符串中复制字符,而不是构建新字符串。
public void get_element(int element_number, StringBuilder buffer)
{
...
// instead of: return line_text.Substring(...);
buffer.Append(line_text, start_index, end_index - start_index);
}
无论如何,构建新字符串的成本不是太高。也许还有其他原因导致你的表现不佳。也许你在做这个方法返回的字符串连接太多了?
答案 1 :(得分:1)
我怀疑问题是由Substring
方法中的边界检查引起的。
但是如果你想确定并且允许不安全的代码,你可以尝试以下string
构造函数:
public unsafe String(
char* value,
int startIndex,
int length
)
像这样:
public static class StringUtils
{
public static unsafe string UnsafeSubstring(this string source, int startIndex, int length)
{
fixed (char* chars = source)
return new string(chars, startIndex, length);
}
}
然后用Substring
替换UnsafeSubstring
来电,看看是否有明显的差异。
答案 2 :(得分:-2)
字符串只是一个char数组。您可以在已知边界之间遍历char数组并替换char。