替换C#String.Substring

时间:2016-08-31 20:08:52

标签: c# performance

我的代码在很大程度上依赖于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函数。我知道情况就是这样。

3 个答案:

答案 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。