我有一个字符串,必须从中删除以下字符:“\r”,“\n”和“\t”。
我尝试了三种不同的方法来删除这些字符并对其进行基准测试,以便获得最快的解决方案。

以下是这些方法以及我执行它们1000000次后的执行时间:

如果我要删除1或2个字符,这应该是最快的解决方案。但是随着我加入更多字符,开始需要更多时间

str = str.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace("\t", string.Empty);

执行时间= 1695

对于1或2个字符,这要比String.Replace慢,但对于3个字符,则显示出更好的性能。
string[] split = str.Split(new char[] { '\t', '\r', '\n' }, StringSplitOptions.None);
str = split.Aggregate<string>((str1, str2) => str1 + str2);

执行时间= 1030

即使是1个字符,也是最慢的。也许我的正则表达式不是最好的。
str = Regex.Replace(str, "[\r\n\t]", string.Empty, RegexOptions.Compiled);

执行时间= 3500

这是我想出的三个解决方案。这里有没有人知道的更好,更快的解决方案,或者我在此代码中可以做的任何改进?

我用于基准测试的字符串:
StringBuilder builder = new StringBuilder();
        builder.AppendFormat("{0}\r\n{1}\t\t\t\r\n{2}\t\r\n{3}\r\n{4}\t\t\r\n{5}\r\n{6}\r\n{7}\r\n{8}\r\n{9}",
         "SELECT ",
         "[Extent1].[CustomerID] AS [CustomerID], ",
         "[Extent1].[NameStyle] AS [NameStyle], ",
         "[Extent1].[Title] AS [Title], ",
           "[Extent1].[FirstName] AS [FirstName], ",
           "[Extent1].[MiddleName] AS [MiddleName], ",
           "[Extent1].[LastName] AS [LastName], ",
           "[Extent1].[Suffix] AS [Suffix], ",
           "[Extent1].[CompanyName] AS [CompanyName], ",
           "[Extent1].[SalesPerson] AS [SalesPerson], ");
        string str = builder.ToString();

最佳答案

这是 super 快速的不安全版本,版本2。

    public static unsafe string StripTabsAndNewlines(string s)
    {
        int len = s.Length;
        char* newChars = stackalloc char[len];
        char* currentChar = newChars;

        for (int i = 0; i < len; ++i)
        {
            char c = s[i];
            switch (c)
            {
                case '\r':
                case '\n':
                case '\t':
                    continue;
                default:
                    *currentChar++ = c;
                    break;
            }
        }
        return new string(newChars, 0, (int)(currentChar - newChars));
    }

这是基准测试(以毫秒为单位剥离1000000个字符串的时间)

cornerback84的String.Replace:9433
安迪·韦斯特的弦乐Concat:4756
AviJ的char数组:1374
Matt Howells的char指针:1163

10-08 08:02
查看更多