Partager via


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’expressions régulières compile les expressions et comment les expressions régulières sont mises en cache. Cet article décrit la compilation, la génération à partir de code source et la mise en cache d’expressions régulières compilées.

Expressions régulières interprété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.

Expressions régulières compilées

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.

Expressions régulières générées à partir de code source

La génération à partir de code source pour les expressions régulières est disponible dans .NET 7 et versions ultérieures. Le générateur de code source émet sous forme de code C# une implémentation dérivée de Regex personnalisée avec une logique similaire à ce que RegexOptions.Compiled émet en langage intermédiaire. Vous bénéficiez de tous les avantages en matière de performances de débit de RegexOptions.Compiled et des avantages de démarrage de Regex.CompileToAssembly, mais sans la complexité de CompileToAssembly. La source émise fait partie de votre projet, ce qui signifie qu’elle est facilement visible et débogable.

Si possible, utilisez des expressions régulières générées à partir du code source au lieu de compiler des expressions régulières avec l’option RegexOptions.Compiled. Pour plus d’informations sur les expressions régulières générées à partir de code source, consultez Générateurs de code source d’expressions régulières .NET.

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’expression régulière fournis aux méthodes d’instance ne sont pas mis en cache.) La mise en cache évite de réanalyser une expression dans du code d’octet haut niveau chaque fois qu’elle est utilisée.

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 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