c# – 为什么我的正则表达式编译速度比解释慢得多?

我有一个大而复杂的C#正则表达式,在解释时运行正常,但有点慢。我正在尝试通过设置RegexOptions.Compiled来加快这个速度,这似乎是第一次需要大约30秒,之后立即。我试图通过将正则表达式编译到程序集来否定这一点,所以我的应用程序可以尽可能快。

我的问题是编译延迟发生,无论是在应用程序中编译:

Regex myComplexRegex = new Regex(regexText, RegexOptions.Compiled);
MatchCollection matches = myComplexRegex.Matches(searchText);
foreach (Match match in matches) // <--- when the one-time long delay kicks in
{

} 

或预先使用Regex.CompileToAssembly:

MatchCollection matches = new CompiledAssembly.ComplexRegex().Matches(searchText);
foreach (Match match in matches) // <--- when the one-time long delay kicks in
{

} 

这使得编译到一个程序集基本上没有用,因为我仍然得到第一个foreach调用的延迟。我想要的是在编译时完成所有的编译延迟(在Regex.CompileToAssembly调用),而不是在运行时。我哪里错了?

(我正在使用的代码编译到程序集,类似于http://www.dijksterhuis.org/regular-expressions-advanced/,如果这是相关的)。

编辑:

在新的CompiledAssembly.ComplexRegex()中调用编译的程序集时,我应该使用new吗?Matches(searchText); ?它给出了一个“对象引用必需”错误,但没有它。

更新2

感谢您的回答/意见。我正在使用的正则表达式相当长,但基本上很简单,每个由|分隔的数千个单词的列表。我看不到它真的是一个回溯问题。主题字符串可以只是一个字母长,仍然可能导致编译延迟。对于RegexOptions.Compiled正则表达式,当正则表达式包含5000个单词时,执行时间将超过10秒。为了比较,正则表达式的非编译版本可以占用30,000个字,并且仍然即时执行。

在做了很多测试之后,我觉得我发现是:

>不要使用RegexOptions.Compiled当您的正则表达式有很多替代方案 – 编译可能非常慢。
> .Net将尽可能使用lazy evaluation for regex,而AFAI可以看到扩展(至少在某种程度上)也是正则表达式编译。正则表达式只有在必须是完全编译时,似乎没有办法提前强制编译。
>如果正则表达式被强制完全编译,则Regex.CompileToAssembly将会更加有用,因为它似乎是无意义的。

请纠正我,如果我错了或缺少一些东西!

当使用RegexOptions.Compiled时,您应该确保重新使用Regex对象。看起来你不是这样做的。

RegexOptions.Compiled是一个权衡。正则表达式的初始构造将更慢,因为代码是即时编译的,但每个匹配应该更快。如果您的正则表达式在运行时更改,则使用RegexOptions.Compiled可能没有任何好处,尽管它可能取决于所涉及的实际表达式。

根据评论更新

如果您的实际代码看起来像您发布的代码,则您不会对CompileToAssembly有任何优势,因为您每次在代码运行时都会创建新的即时编译的Regex实例。为了利用CompileToAssembly,您需要先编译正则表达式;然后获取生成的程序集并将其引用到项目中。然后,您应该实例化生成的强类型的正则表达式类型。

在链接的示例中,他有一个名为FindTCPIP的正则表达式,它被编译成一个名为FindCTPIP的类型。当这需要使用时,应该创建一个新的特定类型的实例,例如:

TheRegularExpressions.FindTCPIP MatchTCP = new TheRegularExpressions.FindTCPIP();
http://stackoverflow.com/questions/4538439/why-is-my-regex-so-much-slower-compiled-than-interpreted

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 为什么我的正则表达式编译速度比解释慢得多?