是string. contains()比遍历string中的整个char数组要快

本文关键字:string char 数组 contains 遍历 | 更新日期: 2023-09-27 18:10:10

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

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

但是,我实际上是遍历整个字符串并将其部分与模式进行比较,所以问题是,String.Contains()实际上是如何工作的?我知道有这样一个问题-弦如何。包含工作吗?但答案并不明确。所以,如果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;
    }

是string. contains()比遍历string中的整个char数组要快

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

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

可以。

并且没有bug(嗯…)。

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

也IIRC字符串的来源。包含可在.Net共享源代码

哦,如果你想要一个性能比较,你可以只衡量你的确切用例

检查这个类似的帖子如何字符串。包含工作

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

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

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

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

如果你现在的细节,你可以用来优化(不仅仅是简单的包含检查)肯定你可以使你的方法比字符串更快。包含,否则- not.