c# - Windows Server 2008 上的正则表达式速度慢

标签 c# .net regex

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

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

我还发现了另一个问题 - 当在同一个 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


这是一个代码片段:

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 个单词,格式如下:

<word text="test" />

最佳答案

我找到了一个解决方案,虽然不是正确的,但对我来说是完美的。出于某种原因,如果我省略 RegexOptions.Compiled 标志,Regex 会快得多。我什至设法在 2008 年服务器上在 65 毫秒内对 100 个长短语执行 Regex

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

关于c# - Windows Server 2008 上的正则表达式速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1491164/

相关文章:

c# - 将 Regex.Matches 连接到一个字符串

c# - 如何链接添加到 DbSet 的实体

c# - 为什么这个位图图像在我加载后改变了它的大小?

c# - ASP.NET MVC - 如何运行单独的进程并让用户继续正常的应用程序使用?

c# - 在 C# 中获取 NamedRange 控件的句柄

c# - .net 核心应用程序目标 Linux 上的 .net framework 4.5.2

java - 如何使用Contains或matches返回true?

Python:使用正则表达式捕获数据

.net - 什么是 System.ServiceModel.Diagnostics.CallbackException,为什么我不能处理它?

regex - 删除带括号的子表达式