String.Contains()比遍历字符串中的整个char数组更快吗?

时间:2013-04-19 09:00:10

标签: c# performance

我有一个函数,它遍历字符串寻找模式并更改它的一部分。我可以通过插入

来优化它
if (!text.Contains(pattern)) return;

但是,我实际上是在遍历整个字符串并将其中的部分与模式进行比较,所以问题是,String.Contains()实际上是如何工作的?我知道有这样一个问题 - How does String.Contains work?但答案还不清楚。所以,如果String.Contains()遍历整个字符数组并将它们与我正在寻找的模式进行比较,那么它不会真正使我的函数更快,但速度更慢。

那么,尝试这样的优化是一个好主意吗?并且 - String.Contains()是否可能比仅仅遍历整个数组并将每个字符与常量字符进行比较的函数更快?

以下是代码:

    public static char colorchar = (char)3;

    public static Client.RichTBox.ContentText color(string text, Client.RichTBox SBAB)
    {
        if (text.Contains(colorchar.ToString()))
        {
            int color = 0;
            bool closed = false;
            int position = 0;
            while (text.Length > position)
            {
                if (text[position] == colorchar)
                {
                    if (closed)
                    {
                        text = text.Substring(position, text.Length - position);
                        Client.RichTBox.ContentText Link = new Client.RichTBox.ContentText(ProtocolIrc.decode_text(text), SBAB, Configuration.CurrentSkin.mrcl[color]);
                        return Link;
                    }

                    if (!closed)
                    {
                        if (!int.TryParse(text[position + 1].ToString() + text[position + 2].ToString(), out color))
                        {
                            if (!int.TryParse(text[position + 1].ToString(), out color))
                            {
                                color = 0;
                            }
                        }
                        if (color > 9)
                        {
                            text = text.Remove(position, 3);
                        }
                        else
                        {
                            text = text.Remove(position, 2);
                        }
                        closed = true;
                        if (color < 16)
                        {
                            text = text.Substring(position);
                            break;
                        }
                    }
                }
                position++;
            }
        }
        return null;
    }

5 个答案:

答案 0 :(得分:1)

简短的回答是,您的优化根本不是优化 基本上,String.Contains(...)只返回String.IndexOf(..) >= 0
你可以改进你的算法:

int position = text.IndexOf(colorchar.ToString()...);
if (-1 < position)
{  /* Do it */ }

答案 1 :(得分:0)

并没有错误(啊......)。

有很好的方法可以在很长的文本中查找多个子字符串,但对于大多数常见的用法,String.Contains(或IndexOf)是最好的。

同样是IIRC,String .Contains的源代码可以在.Net共享源

中找到

哦,如果你想进行性能比较,你可以测量你的确切用例

答案 2 :(得分:0)

检查此类似帖子How does string.contains work

我认为你不能简单地做任何比String.Contains更快的事情,除非你想使用msvcrt.dll中提供的标准CRT函数wcsstr,这不是那么容易

答案 3 :(得分:0)

除非您已对自己的应用程序进行了分析并确定String.Contains的行是瓶颈,否则不应进行任何此类过早优化。保持代码意图的清晰度更为重要。

虽然有许多方法可以在.NET基类中实现这些方法,但您应该假设默认实现对于大多数人的用例来说是最佳的。例如,.NET 的任何(未来)实现可能使用特定于x86的指令进行字符串比较。那将永远比你在C#中做的更快。

如果您确实想确定自定义字符串比较代码是否比String.Contains更快,则需要使用多次迭代来测量它们,每次迭代都使用不同的字符串。例如,使用Stopwatch class来衡量时间。

答案 4 :(得分:0)

如果你现在可以用于优化的细节(不仅仅是简单的包含检查)确定你的方法比string.Contains更快,否则 - 不是。