Quand ne pas utiliser RegexOptions.Compilé
Je comprends l'avantage de l'utilisation de RegexOptions.Compilé -
il améliore le temps d'exécution de l'application par l'expression régulière en forme compilée au lieu de l'interpréter au moment de l'exécution. Bien que l'utilisation de ce n'est pas recommandé pour les applications qui sont déjà lent au démarrage.
Mais si ma demande peut porter toute légère augmentation du temps de démarrage de l' -
quelles sont les autres scénarios dans lesquels je ne devrais PAS utiliser RegexOptions.Compilé?
Juste une remarque, je suis à l'appel de cette méthode à plusieurs reprises -
private static string GetName(string objString)
{
return Regex.Replace(objString, "[^a-zA-Z&-]+", "");
}
Ainsi, cette méthode est appelée avec des valeurs différentes pour "objString" (bien que les valeurs pour objString peut refaire).
Pensez-vous que c'est bon/pas bon d'utiliser RegexOptions.Compilé ici?
Tout lien web serait vraiment utile.
Merci!!!!
MODIFIER
J'ai testé mon application web avec les deux
RegexOptions.Compiled
, et- Instancier
Regex
comme variable de classe
Mais ne pouvait pas trouver une grosse différence dans le temps pris par mon application web -
Seule chose que j'ai remarqué dans les deux scénarios est que la première fois lors du chargement de l'application, c'est de prendre le double du temps pris par rapport à celle successives de chargement de la page et c'est indépendamment du fait que j'utilise RegexOptions.Compilé ou non.
Des commentaires pour --
pourquoi mon application web prend plus de temps pour l'expression rationnelle de processus pour la première fois, et le temps est presque réduite à la moitié ou moins dans les chargements ultérieurs - Est-il intégré la mise en cache ou de certains autres .net fonction est d'aider ici.
P. S. C'est chose même si j'utilise RegexOptions.Compilé ou non.
- Parfois, il n'est de ralentir les choses de façon spectaculaire... le tester avant de l'utiliser.
Vous devez vous connecter pour publier un commentaire.
Pour une performance question comme ça, la meilleure façon de déterminer de quelle manière est plus rapide est de tester les deux et de voir.
En général, la compilation d'une expression régulière est peu probable d'avoir beaucoup d'avantages, sauf si vous êtes en utilisant les regex une beaucoup, ou sur très grandes chaînes. (Ou les deux). Je pense que c'est plus une optimisation de l'essayer après que vous avez déterminé que vous avez un problème de performance et vous pensez que cela peut aider, pour les essayer au hasard.
Pour des discussions générales sur les inconvénients de
RegexOptions.Compiled
, voir ce post de blog de Jeff Atwood; il est très vieux, mais ce que je comprends, aucun des grands faits pertinents ont changé depuis qu'il a été écrit.Deux choses à penser sont que
RegexOptions.Compiled
prend le temps CPU et de la mémoire.Avec cela à l'esprit, il est fondamentalement juste un exemple, lorsque vous devez pas utilisation RegexOptions.Compilé :
Il y a trop de variables à prédire et de tracer une ligne dans le sable, pour ainsi dire. Il avait vraiment besoin de tests afin de déterminer la meilleure approche à adopter. Ou, si vous n'avez pas envie de tester, puis ne pas utiliser
Compiled
jusqu'à ce que vous faites.Maintenant, si vous ne choisissez
RegexOptions.Compiled
il est important que vous n'êtes pas de gaspillage avec elle.Souvent la meilleure façon de le faire est de définir votre objet, comme une variable statique qui peut être réutilisé à plusieurs reprises. Par exemple...
Le seul problème avec cette approche est que si vous êtes à la déclaration à l'échelle mondiale, alors il peut être un gaspillage si votre application n'est pas toujours l'utiliser, ou ne pas l'utiliser lors du démarrage. Ainsi, une approche légèrement différente serait d'utiliser chargement différé comme je le décris dans l'article que j'ai écrit hier.
Donc dans ce cas ce serait quelque chose comme ceci...
Ensuite, il vous suffit de référence
NameRegex.Value
chaque fois que vous souhaitez utiliser cette expression régulière et il est instancié quand il est d'abord accessible.RegexOptions.Compilé dans le Monde Réel
Sur un couple de mes sites, je suis en utilisant les Regex routes pour ASP.NET MVC. Et ce scénario est parfait pour
RegexOptions.Compiled
. Les itinéraires sont définis lors de l'application web démarre, et sont ensuite réutilisés pour toutes les demandes ultérieures tant que l'application continue de fonctionner. De sorte que ces expressions régulières sont instanciés et compilé une fois et réutilisés à des millions de fois.À partir d'un BCL post de blog, la compilation augmente le temps de démarrage d'un ordre de grandeur, mais une diminution subséquente des durées maximales d'environ 30%. L'utilisation de ces numéros, la compilation devrait être considéré pour un motif que vous vous attendez à être évalué plus de 30 fois. (Bien sûr, comme tout l'optimisation de la performance, à la fois des solutions de rechange doivent être mesurés pour l'acceptabilité.)
Si la performance est critique pour une simple expression appelée à plusieurs reprises, vous voudrez peut-être éviter en utilisant des expressions régulières tout à fait. J'ai essayé de lancer quelques variantes près de 5 millions de fois chaque:
Remarque: modifiés depuis la version précédente pour corriger expression régulière.
L'exécution de manière indépendante pour 5 millions aléatoire des chaînes ASCII, 30 caractères chacune, a constamment donné ces chiffres:
Qui est, compilation fournie à environ 25% des performances pour un très grand nombre d'évaluations de ce schéma, avec la première exécution en cours environ 3 fois plus lent. Les méthodes qui fonctionne sur le sous-jacent des tableaux de caractères étaient 12 fois plus rapide que la compilation des expressions régulières.
Tandis que la méthode 4 ou 5 méthode peut offrir un certain avantage en termes de performances sur les expressions régulières, les autres méthodes peuvent fournir d'autres avantages (facilité de gestion, la lisibilité, la souplesse, etc.). Ce test simple fait de penser que, dans ce cas, la compilation de l'expression régulière a un léger avantage en matière de performances d'interprétation pour un grand nombre d'évaluations.
[^]
de la classe de caractères, de sorte qu'il devient un point d'ancrage? Vous avez testé complètement le mauvais Regex, ce qui pourrait avoir de très différentes caractéristiques de performance de celui en question.Compilation généralement seulement améliore les performances si vous êtes économiser de l'objet Regex que vous créez. Puisque vous n'êtes pas, dans votre exemple, l'enregistrement de la Regex, vous ne devriez pas le compiler.
Vous pourriez vouloir restructurer le code de cette façon (remarque je l'ai ré-écrit le regex pour ce que je pense vous le souhaitez. Avoir le début-de-ligne carat dans une répétition de groupe ne fait pas beaucoup de sens, et je suppose un préfixe de nom se termine par un tiret):
J'ai écrit certains de test de code de ce aussi:
Sur ma machine, j'obtiens:
[^...]
notation signifie "n'importe quel caractère qui n'est pas dans...
"; donc[^a-zA-Z&-]+
signifie "un ou plusieurs caractères non ASCII des lettres, des arobases, ou des traits d'union".