【发布时间】:2013-04-19 09:00:09
【问题描述】:
我有一个函数遍历字符串寻找模式并改变它的一部分。我可以通过插入优化它
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;
}
【问题讨论】:
-
您必须发布(概述)其余代码。但是,是的,你很可能在这里做双重工作。
-
为什么不在 for 循环中对这两种方法计时?
-
“那么,尝试这样的优化是个好主意吗?”几乎可以肯定不是!这一定是库中最常用的函数之一。它受到了很多关注。很难想象你可以改进它,除非非常特殊的情况和真正敬业的专家。
-
遍历字符串、匹配模式、更改字符串...也许您还想计算正则表达式的执行方式。
-
您可能还想用字符串的 IndexOf 方法替换找到位置的代码。比如
position = text.IndexOf(colorchar);然后position = text.IndexOf(colorchar, position);
标签: c# performance