正则表达式在Windows Server 2008上变慢

我的情况是我的正则表达式在Windows Server 2008上编译得非常慢。我写了一个小型控制台应用程序来突出显示这个问题。 该应用程序生成自己的输入,并从XML文件中的单词构建一个正则表达式。 我构建了这个应用程序的发布版本,并在我的个人笔记本电脑(运行XP)和Windows 2008服务器上运行它。 正则表达式在我的笔记本电脑上编译需要0.21秒,但在服务器上编译需要23秒。

可能导致这种情况的任何想法? 问题只出现在首次使用正则表达式时(首次编译时 – 此后它很好)

我还发现了另一个问题 – 当在同一个Windows 2008服务器上的正则表达式中使用\s+时,内存气球(使用4GB +)并且Regex的编译永远不会完成。

Regex和64位.net是否存在已知问题? 是否有针对此的修复/补丁? 我无法在网上找到任何信息,但我在Framework 2.0中找到了一些关于同样问题的文章 – 这肯定已经解决了吗?

更多信息:服务器运行64位版本的.net框架(3.5 SP1),在我的笔记本电脑上安装了Visual Studio 2008和3.5框架。 正则表达式具有以下模式: ^word$|^word$|^word$和使用以下标志构造: RegexOptions.IgnoreCase | RegexOptions.Compiled RegexOptions.IgnoreCase | RegexOptions.Compiled


这是一段代码:

 StringBuilder regexString = new StringBuilder(); if (!String.IsNullOrEmpty(fileLocation)) { XmlTextReader textReader = new XmlTextReader(fileLocation); textReader.Read(); while (textReader.Read()) { textReader.MoveToElement(); if (textReader.Name == "word") { regexString.Append("^" + textReader.GetAttribute(0) + "$|"); } } ProfanityFilter = new Regex(regexString.ToString(0, regexString.Length - 1), RegexOptions.IgnoreCase | RegexOptions.Compiled); } DateTime time = DateTime.Now; Console.WriteLine("\nIsProfane:\n" + ProfanityFilter.IsMatch("test")); Console.WriteLine("\nTime: " + (DateTime.Now - time).TotalSeconds); Console.ReadKey(); 

这导致笔记本电脑的时间为0.21秒,2008服务器的时间为23秒。 XML文件由168个单词组成,格式如下:

  

我找到了一个解决方案,不是正确的解决方案,但在我的情况下是完美的。 出于某种原因,如果我RegexOptions.Compiled标志,正则Regex要快得多。 我甚至设法在2008服务器上以不到65毫秒的速度执行100个长短语的正则Regex

这必须是.net lib中的一个错误,因为未编译版本应该比编译版本慢得多。 无论哪种方式,每次检查不到1毫秒对我来说是非常可接受的:)

您可以使用Regex.CompileToAssembly方法预编译正则表达式,然后您可以将已编译的正则表达式部署到您的服务器。

我遇到了完全相同的问题。 我的应用程序在x86机器上工作正常,但内存气球和挂在x64上。 删除编译标志没有帮助。 我今天在.net 4.0上尝试了这个问题,问题仍然存在。 如果你有一个repro,我建议你提交一个bug。

我认为MSFT知道这一点,请参见下面的评论

但让他们决定这是不是同一个bug。 如果您提交了文件,请在此处添加指向您的文件的链接,以便我可以添加我的评论。