我遇到过这样的情况:我的正则表达式在 Windows Server 2008 上编译速度非常慢。我编写了一个小型控制台应用程序来突出显示这个问题。该应用程序生成自己的输入,并根据 XML 文件中的单词构建正则表达式。我构建了这个应用程序的发布版本,并在我的个人笔记本电脑(运行 XP)和 Windows 2008 服务器上运行它。正则表达式在我的笔记本电脑上编译需要 0.21 秒,但在服务器上编译需要 23 秒。
有什么想法可能导致这种情况吗?问题仅出现在第一次使用正则表达式时(首次编译时 - 此后就可以了)
我还发现了另一个问题 - 使用时\s+
在同一 Windows 2008 服务器上的正则表达式中,内存气球(使用 4GB+)和正则表达式的编译永远不会完成。
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
快得多。我什至设法执行了Regex
在 2008 年的服务器上,在 65 毫秒内处理 100 个长短语。
这肯定是 .net 库中的一个错误,因为未编译的版本应该比编译的版本慢得多。不管怎样,每次检查不到 1 毫秒对我来说是非常可以接受的:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)