5

我有一个函数正在遍历字符串以查找模式并更改其中的部分。我可以通过插入优化它

if (!text.Contains(pattern)) return;

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

5 回答 5

1

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

int position = text.IndexOf(colorchar.ToString()...);
if (-1 < position)
{  /* Do it */ }
于 2013-04-19T09:30:29.890 回答
0

如果您现在了解可用于优化的详细信息(不仅仅是简单的包含检查),请确保您可以使您的方法比 string.Contains 更快,否则 - 不会。

于 2014-01-23T14:04:12.577 回答
0

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

Ans 虽然有很多方法可以实现 .NET 基类中的方法,但您应该假设默认实现对于大多数人的用例来说已经足够优化了。例如,.NET 的任何(未来)实现都可能使用特定于 x86 的指令进行字符串比较。那么这总是比你在 C# 中可以做的更快。

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

于 2013-04-19T09:38:52.550 回答
0

检查这个类似的帖子string.contains 是如何工作的

我认为你将无法简单地做任何比 String.Contains 更快的事情,除非你想使用标准 CRT 函数 wcsstr,在 msvcrt.dll 中可用,这并不容易

于 2013-04-19T09:15:57.733 回答
0

是的。

并且没有错误(啊……)。

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

IIRC 的 String.Contains 的来源也可在 .Net 共享来源中找到

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

于 2013-04-19T09:15:09.727 回答