代码之家  ›  专栏  ›  技术社区  ›  pjmyburg

Windows Server 2008上的正则表达式运行缓慢

  •  5
  • pjmyburg  · 技术社区  · 17 年前

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

    你知道是什么原因造成的吗?问题仅在于首次使用Regex(首次编译时-之后就可以了)

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

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

    ^word$|^word$|^word$ 并且由以下标志构成: 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();
    

    XML文件由168个单词组成,格式如下:

    <word text="test" />
    
    3 回复  |  直到 10 年前
        1
  •  4
  •   Bhushan Firake    13 年前

    我找到了一个解决方案,虽然不是正确的,但对我来说是完美的。出于某种原因,如果我遗漏了 RegexOptions.Compiled Regex 速度要快得多。我甚至设法执行了 正则表达式

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

        2
  •  4
  •   Laurel Enrique    10 年前

    Regex.CompileToAssembly 方法,然后您可以将编译后的regex部署到服务器上。

        3
  •  1
  •   abatishchev Karl Johan    13 年前

    我遇到了完全相同的问题。我的应用程序在x86机器上运行良好,但在x64上内存膨胀并挂起。删除编译标志没有帮助。我今天在.net 4.0上尝试了这个,问题仍然存在。如果你有一个复制品,我建议你提交一个bug。

    我想微软知道这件事,看看底部 comment here