非常慢的正则表达式性能

本文关键字:性能 正则表达式 非常 | 更新日期: 2023-09-27 18:35:50

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

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"); 

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

非常慢的正则表达式性能

您可以通过编译和缓存它们来加快正则表达式的速度,但不太可能解决您拥有的规模的性能问题。 也就是说,一些需要 O(n^2) 的慢速正则表达式不会因为缓存/编译或任何其他类型的自动处理而神奇地变成 O(n)。

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

如果字符串解析起来不是那么复杂,我会将它们转换为字符数组并自己解析它们。它将显著提高性能。正则表达式的性能非常差。

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.
}