为什么我的正则表达式编译比解释慢这么多?我有一个大而复杂的C#正则表达式,在解释时可以正常工作,但速度有点慢。我试图通过设置RegexOptions.Compiled来加快速度,第一次和之后似乎大约需要30秒。我试图通过首先将正则表达式编译为程序集来否定这一点,因此我的应用程序可以尽可能快。我的问题是当编译延迟发生时是否在应用程序中编译:RegexmyComplexRegex=newRegex(regexText,RegexOptions.Compiled);MatchCollectionmatches=myComplexRegex.Matches(searchText);foreach(Matchmatchinmatches)//<---当一次性长延迟开始时{}或提前使用Regex.CompileToAssembly:MatchCollectionmatches=newCompiledAssembly.ComplexRegex().Matches(searchText);foreach(Matchmatchinmatches)//<---当一次性长时间延迟开始时{}这使得编译程序基本上无用,因为我仍然在第一次foreach调用时得到延迟。我想要的是所有编译延迟都在编译时完成(在Regex.CompileToAssembly调用中),而不是在运行时。我哪里错了?(我用来编译成程序集的代码类似于http://www.dijksterhuis.org/regular-expressions-advanced/,如果相关的话)。编辑:我应该使用newnewCompiledAssembly.CompledRegex().Matches(searchText);调用已编译程序集时?它没有它,但它给出了“需要对象引用”错误。更新2感谢您的回答/评论。我使用的正则表达式很长但基本上很简单,列出了数千个单词,每个单词由|分隔。我真的不认为这是一个回溯问题。主题字符串只能是一个字母长,但它仍然会导致编译延迟。对于RegexOptions.Compiled正则表达式,当正则表达式包含5000个单词时,执行时间将超过10秒。相比之下,非编译版本的正则表达式可以使用30,000多个单词并仍然立即执行。经过大量测试后,这就是我认为我发现的:如果我错了或遗漏了什么,请纠正我!使用RegexOptions.Compiled,您应该确保重用Regex对象。看起来你没有。RegexOptions.Compiled是一种权衡。正则表达式的初始构造会比较慢,因为代码是及时编译的,但每次匹配都应该更快。如果正则表达式在运行时更改,使用RegexOptions.Compiled可能没有任何好处,尽管它可能取决于所涉及的实际表达式。根据评论更新如果您的实际代码与您发布的代码相似,那么您就没有利用CompileToAssembly,因为它会在您每次运行该代码时创建一个新的运行Regex实例。为了利用CompileToAssembly,您需要先编译Regex;然后获取生成的程序集并在您的项目中引用它。然后,您应该实例化生成的强类型Regex类型。在您链接到的示例中,他有一个名为FindTCPIP的正则表达式,它被编译为一个名为FindCTPIP的类型。当你需要使用它时,你应该创建一个这个特定类型的新实例,例如:TheRegularExpressions.FindTCPIPMatchTCP=newTheRegularExpressions.FindTCPIP();尝试使用Regex.CompileToAssembly,然后链接到程序集,以便您可以构造Regex对象。RegexOptions.Compiled是一个运行时选项,每次运行应用程序时仍会重新编译正则表达式。在调查慢速正则表达式时,一个很可能的原因是它回溯太多。这可以通过重写正则表达式来解决,使回溯量不存在或最小化。你能发布正则表达式和一个缓慢的样本输入吗?就个人而言,我不必编译正则表达式,尽管如果您沿着这条路走下去,看到一些关于性能的真实数字会很有趣。要强制初始化,您可以针对空字符串调用Match。最重要的是,您可以使用ngen创建表达式的原生图像,以进一步加快该过程。但也许最重要的是,对于给定的文本,抛出30.000个string.IndexOf或string.Contains或Regex.Match语句基本上与编译一个巨大的表达式来匹配单个文本一样快。因为这需要更少的编译、jitting等,因为状态机更简单。您可以考虑的另一件事是标记文本并将其与您之后的单词列表相交。以上是C#学习教程:为什么我的正则表达式编译比解释慢很多?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
