Compilation et réutilisation dans les expressions régulières

Vous pouvez optimiser les performances des applications qui utilisent très souvent des expressions régulières en comprenant comment le moteur d’expression régulière compile les expressions et comment les expressions régulières sont mises en cache. Cette rubrique décrit la compilation et la mise en cache.

Expressions régulières compilées

Par défaut, le moteur d’expression régulière compile une expression régulière en une séquence d’instructions internes (il s’agit des codes généraux différents de Common Intermediate Language, ou CIL). Quand le moteur exécute une expression régulière, il interprète les codes internes.

Si un objet Regex est construit avec l’option RegexOptions.Compiled, il compile l’expression régulière en code CIL explicite plutôt qu’en instructions internes d’expression régulière générale. Ainsi, le compilateur juste-à-temps (JIT) de .NET convertit l’expression en code machine natif pour de meilleures performances. Le coût de construction de l’objet Regex peut être plus élevé, mais le coût des mises en correspondance avec celui-ci est souvent beaucoup plus faible.

Une alternative serait d’utiliser des expressions régulières précompilées. Vous pouvez compiler l’ensemble de vos expressions dans une DLL réutilisable à l’aide de la méthode CompileToAssembly. Cela évite d’avoir à compiler au moment de l’exécution tout en continuant à tirer parti de la rapidité des expressions régulières compilées.

Cache des expressions régulières

Pour améliorer les performances, le moteur d’expression régulière gère un cache à l’échelle de l’application des expressions régulières compilées. Ce cache stocke les modèles d’expression régulière utilisés uniquement dans les appels de méthode statique. (Les modèles d’expressions régulières fournis aux méthodes d’instance ne sont pas mis en cache.) Cela évite d’avoir à réanalyser une expression en bytecode de haut niveau à chacune de ses utilisations.

Le nombre maximal d’expressions régulières mises en cache est déterminé par la valeur de la propriété Regex.CacheSizestatic (Shared en Visual Basic). Par défaut, le moteur d’expression régulière met en cache jusqu’à 15 expressions régulières compilées. Si le nombre d’expressions régulières compilées dépasse la taille du cache, l’expression régulière la plus anciennement utilisée est ignorée et la nouvelle expression régulière est mise en cache.

Votre application peut réutiliser des expressions régulières de l’une des deux manières suivantes :

  • En utilisant une méthode statique de l’objet Regex pour définir l’expression régulière. Si vous utilisez un modèle d’expression régulière qui a déjà été défini par un autre appel de méthode statique, le moteur d’expression régulière essaie de récupérer l’expression régulière à partir du cache. Si l’expression régulière n’est pas disponible dans le cache, le moteur la compile et l’ajoute au cache.

  • En réutilisant un objet Regex existant tant que son modèle d’expression régulière est nécessaire.

En raison de la surcharge liée à l’instanciation d’objets et à la compilation d’expressions régulières, la création et la destruction rapide d’un grand nombre d’objets Regex est un processus très coûteux. Pour les applications qui utilisent un grand nombre d’expressions régulières différentes, vous pouvez optimiser les performances en utilisant des appels de méthodes Regex statiques et en augmentant éventuellement la taille du cache des expressions régulières.

Voir aussi