Regex медленно в Windows Server 2008

У меня есть ситуация, когда мои регулярные выражения очень медленно компилируются в Windows Server 2008. Я написал небольшое консольное приложение, чтобы осветить эту проблему. Приложение генерирует собственный ввод и создает регулярные выражения из слов в файле XML. Я создал релизную версию этого приложения и запустил его как на своем персональном ноутбуке (под управлением XP), так и на сервере Windows 2008. Регулярное выражение заняло 0,21 секунды для компиляции на моем ноутбуке, но 23 секунды для компиляции на сервере.

Есть идеи, что может быть причиной этого? Проблема только при первом использовании Regex (когда он впервые скомпилирован - после этого все в порядке)

Я также нашел другую проблему - при использовании \s+ в регулярном выражении на том же сервере Windows 2008 всплывающие подсказки (использующие 4 ГБ +) и компиляция Regex никогда не заканчиваются.

Известна ли проблема с Regex и 64-разрядным.net? Для этого есть исправление / патч? Я не могу найти какую-либо информацию в сети, но я нашел несколько статей об этой же проблеме в Framework 2.0 - наверняка это уже исправлено?

Дополнительная информация: На сервере установлена ​​64-битная версия.net Framework (3.5 SP1), и на моем ноутбуке установлена ​​Visual Studio 2008 и 3.5 Framework. Регулярное выражение имеет следующий шаблон: ^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" />

3 ответа

Решение

Я нашел решение, не правильное, но идеальное в моем случае. По какой-то причине, если я пропущу RegexOptions.Compiled флаг, Regex намного, намного быстрее. Мне даже удалось выполнить Regex на 100 длинных фраз менее чем за 65 миллисекунд на сервере 2008 года.

Это должно быть ошибкой в ​​.net lib, поскольку предполагается, что некомпилированная версия будет намного медленнее, чем скомпилированная версия. В любом случае, менее 1 миллисекунды за проверку очень приемлемо для меня:)

Вы можете предварительно скомпилировать свои регулярные выражения, используя Regex.CompileToAssembly метод, а затем вы можете развернуть скомпилированные регулярные выражения на вашем сервере.

Я столкнулся с точно такой же проблемой. Мое приложение отлично работает на компьютерах с архитектурой x86, но на 64-битной памяти зависает и зависает. Удаление флага компиляции не помогло. Я попробовал это сегодня на.net 4.0, и проблема остается. Если у вас есть репродукция, я предлагаю вам сообщить об ошибке.

Я думаю, что MSFT знает об этом, см. Нижний комментарий здесь

Но пусть они решат, если это та же ошибка. Пожалуйста, добавьте ссылку на вашу заявку здесь, если вы подаете, чтобы я мог добавить свои комментарии к ней.

Другие вопросы по тегам