J'ai une situation où mes expressions régulières compilent extrêmement lentement sur Windows Server 2008. J'ai écrit une petite application console pour mettre en évidence ce problème. L'application génère sa propre entrée et construit un Regex à partir de mots dans un fichier XML. J'ai construit une version de cette application et l'ai exécutée à la fois sur mon ordinateur portable personnel (exécutant XP) et sur le serveur Windows 2008. L'expression régulière a pris 0,21 secondes pour compiler sur mon ordinateur portable, mais 23 secondes pour compiler sur le serveur.Regex lent sur Windows Server 2008
Des idées de quoi cela pourrait-il être responsable? Le problème est seulement sur la première utilisation de la Regex (quand il est d'abord compilé - par la suite il est bien)
J'ai également trouvé un autre problème - en utilisant \s+
dans l'expression régulière sur le même serveur Windows 2008, les ballons de mémoire (utilise 4GB +) et la compilation du Regex ne se termine jamais.
Existe-t-il un problème connu avec Regex et 64 bits .net? Y at-il un correctif/correctif disponible pour cela? Je ne peux pas vraiment trouver d'informations sur le net, mais j'ai trouvé quelques articles à propos de ces mêmes problèmes dans Framework 2.0 - cela a certainement été corrigé à ce jour?
Plus d'informations: Le serveur exécute la version 64 bits du framework .net (3.5 SP1) et sur mon ordinateur portable j'ai Visual Studio 2008 et le framework 3.5 installé. L'expression régulière est le schéma suivant: ^word$|^word$|^word$
et est construit avec les indicateurs suivants: RegexOptions.IgnoreCase | RegexOptions.Compiled
Voici un extrait de code:
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();
Il en résulte un temps de 0,21 secondes sur mon ordinateur portable et 23 secondes sur le serveur 2008. Le fichier XML est composé de 168 mots dans le format suivant:
<word text="test" />
Que diriez-vous de l'exemple de code, pour regex et xml? –