0

我的应用程序很慢,有时需要几个小时才能恢复正常。当我使用分析器时,我发现代码花费了大量时间,这只不过是发生正则表达式匹配的地方。任何机构都可以指导我如何提高性能。代码片段如下所示

Regex rx = new Regex(@"^[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*\@[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*\.[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*$|^$");
rx.IsMatch("john.gilbert.stu.seattle.washington.us"); 

有什么办法可以缓存模式并重用它?

4

2 回答 2

3

您可以通过编译和缓存它们来加快 RegEx,但它不太可能解决您所拥有的规模的性能问题。即,由于缓存/编译或任何其他类型的自动处理,一些需要 O(n^2) 的慢 RegEx 不会神奇地变成 O(n)。

您需要检查正则表达式并验证每个表达式的执行次数。最快的代码是根本不需要运行的代码——所以如果你有任何第一个,就消除浪费的匹配。您可能需要切换到更合适的文本解析方式(即,HTML 的 RegEx 解析很可能是错误的方式 - 一些好的 HTML 解析器,如 HtmlAgilityPack 结合目标查询可能更合适)。

于 2012-05-31T17:16:47.093 回答
1

如果字符串解析起来并不复杂,我只需将它们转换为字符数组并自己解析它们。它将显着提高性能。RegEx 的性能很差。

for (int i = 0; i < string.Length; i++)
{
     if (string[i] has some defining quality)
         if (string[i] meets second requirement)
         // break, change flag, ect.
}
于 2012-05-31T17:25:29.470 回答