0

我有如下所示的代码,它正在做正则表达式比较,我想优化代码。当我使用 .net 分析器检查时,它显示 80 % 的时间在这里花费,我检查了我的正则表达式过滤器是否发生任何回溯,但在正则表达式方面没有任何问题。所以这是现有的代码

public class TestFilter : SmoothFilter
   {
     public override bool Apply(Team liveEvent)
          {
                   // Apply each individual piece of the filter using the Match method
                   if ((Filter == null) || (Filter.Length <= 0) || Match(Filter, pl.Instance))
                   {

          }

    private bool Match(string pattern, string inputdata)
    {
        bool vals = Regex.IsMatch(inputdata, pattern, RegexOptions.IgnoreCase);
        return vals;
    }
}

当我用谷歌搜索时,我看到了链接http://blog.kurtschindler.net/post/regular-expression-performance-comparisons,如果您不花费初始启动时间,则提到了最佳和更快的方法。所以我修改了我的代码,如下所示。但是我移动了我的系统,我没有任何工具可以分析,任何人都可以告诉我它是否真的有所改善?下面这个修改过的代码

 static readonly Regex regexForMethod_E = new Regex("pattern", RegexOptions.Compiled);

 private bool Match(string pattern, string inputdata)
 {
     bool vals = regexForMethod_E.IsMatch("inputdata");
     return vals;
}

编辑

我仍然不知道如何在 Match() 方法中移动正则表达式实例化

4

2 回答 2

1

这取决于模式的复杂性。在任何情况下它都不会变慢,它会随着正则表达式的更复杂而加快速度。

此外,您的代码不等效。为此,您需要调用:

new Regex("pattern", RegexOptions.Compiled | RegexOptions.IgnoreCase);
于 2012-07-18T09:00:55.943 回答
0

简短的回答:我相信是的,是的,但我不知道有多少。

长(呃)答案:我认为您正在为自己和计算节省大量时间:看看您的方法首先需要执行多少即时计算。现在看看第二种方法需要做多少——你的函数只需要传递一个参数,而不是 3 个;这是性能提升(尽管很小)。

正则表达式已经计算过了,所以程序需要做的就是根据您的输入数据检查它,而不是获取所有参数并即时计算它们。

一个更快的方法是这样的:

private bool Match(string inputdata)
{
     return regexForMethod_E.IsMatch("inputdata");
}

我知道这种变化几乎可以忽略不计,但想象一下这个电话被打了 1000 次。那是您实际上不需要的 1000 个布尔变量!

于 2012-07-18T07:30:11.223 回答